【初心者向け】PostgreSQLで挿入データを楽々ゲット! RETURNING句のしくみとサンプルコード

2024-07-02

PostgreSQLで挿入された行を返す

基本的な構文

INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
RETURNING column1, column2, ...;

この構文では、table_nameテーブルに新しい行が挿入され、column1column2などの列にそれぞれvalue1value2などの値が設定されます。RETURNING句によって、column1column2などの列の値が返されます。

すべての列の値を返すには、*を使用します。

INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
RETURNING *;

次の例では、usersテーブルに新しい行が挿入され、挿入された行のIDと名前が返されます。

INSERT INTO users (name, email)
VALUES ('Taro Yamada', '[email protected]')
RETURNING id, name;

このステートメントは次のような結果を返します。

id | name
----+---------
1  | Taro Yamada

RETURNING句は以下のことができます。

  • 挿入された行の任意の列を返す
  • 関数や式の結果を返す
  • 複数の行を返す

注意事項

  • RETURNING句を使用するには、PostgreSQL 8.2以降が必要です。
  • RETURNING句は、INSERT、UPDATE、DELETEステートメントで使用できます。
  • RETURNING句で返される行の数は、挿入された行の数と同じです。



    PostgreSQLにおける挿入された行の返還:サンプルコード

    この例では、usersテーブルに新しいユーザー情報を挿入し、挿入されたユーザーのIDを取得します。

    CREATE TABLE users (
      id SERIAL PRIMARY KEY,
      name TEXT NOT NULL,
      email TEXT NOT NULL
    );
    
    INSERT INTO users (name, email)
    VALUES ('Taro Yamada', '[email protected]')
    RETURNING id;
    

    このコードを実行すると、次のような結果が得られます。

    id
    ---
    1
    

    例2:商品情報の挿入と価格の更新

    この例では、productsテーブルに新しい商品情報を挿入し、挿入された商品の価格を10%値上げします。

    CREATE TABLE products (
      id SERIAL PRIMARY KEY,
      name TEXT NOT NULL,
      price DECIMAL(10,2) NOT NULL
    );
    
    INSERT INTO products (name, price)
    VALUES ('T-Shirt', 1000)
    RETURNING id, price;
    
    id | price
    ---+-------
    1  | 1100.00
    

    例3:注文情報の挿入と注文明細の追加

    この例では、ordersテーブルに新しい注文情報を作成し、order_detailsテーブルに注文明細を追加します。

    CREATE TABLE orders (
      id SERIAL PRIMARY KEY,
      customer_id INTEGER NOT NULL,
      order_date DATE NOT NULL
    );
    
    CREATE TABLE order_details (
      id SERIAL PRIMARY KEY,
      order_id INTEGER NOT NULL REFERENCES orders(id),
      product_id INTEGER NOT NULL,
      quantity INTEGER NOT NULL
    );
    
    INSERT INTO orders (customer_id, order_date)
    VALUES (1, '2024-07-02')
    RETURNING id;
    
    id
    ---
    1
    

    続いて、order_detailsテーブルに注文明細を追加します。

    INSERT INTO order_details (order_id, product_id, quantity)
    VALUES (1, 1, 2);
    

    説明

    これらの例は、RETURNING句を使用して挿入された行のデータを取得する方法を示しています。RETURNING句は、さまざまな目的に使用できる汎用的な機能です。

    補足

    • 上記の例はほんの一例です。RETURNING句を使用して、さまざまな操作を実行できます。



    トリガーを使用する

    トリガーは、データベース内のイベントに応じて自動的に実行されるコードの塊です。挿入された行を返すトリガーを作成することで、RETURNING句を使用せずに挿入された行のデータを取得することができます。

    長所

    • RETURNING句を使用するよりも柔軟性が高い
    • 挿入された行以外にも、トリガー内で他の処理を実行できる

    短所

    • RETURNING句よりも複雑
    • トリガーが実行されるたびにオーバーヘッドが発生する
    CREATE TABLE users (
      id SERIAL PRIMARY KEY,
      name TEXT NOT NULL,
      email TEXT NOT NULL
    );
    
    CREATE OR REPLACE FUNCTION insert_user_trigger() RETURNS TRIGGER AS $$
    BEGIN
      INSERT INTO user_logs (user_id, action)
      VALUES (NEW.id, 'INSERT');
    
      RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    
    CREATE TRIGGER insert_user_after_insert
    AFTER INSERT ON users
    FOR EACH ROW
    EXECUTE PROCEDURE insert_user_trigger();
    

    この例では、usersテーブルに新しいユーザーが挿入されるたびに、user_logsテーブルにログエントリが挿入されます。

    • シンプルで使いやすい
    • RETURNING句よりもパフォーマンスが優れている場合がある
    • トリガーほど柔軟性がない
    • ビューを変更すると、既存のクエリが影響を受ける可能性がある
    CREATE TABLE users (
      id SERIAL PRIMARY KEY,
      name TEXT NOT NULL,
      email TEXT NOT NULL
    );
    
    CREATE VIEW new_users AS
    SELECT * FROM users
    WHERE id IN (
      SELECT id FROM users
      ORDER BY id DESC
      LIMIT 1
    );
    

    この例では、new_usersというビューが作成され、最後に挿入されたユーザーのみが表示されます。

    サブクエリを使用する

    • 他の方法と組み合わせることができる
    • パフォーマンスが劣る場合がある
    INSERT INTO users (name, email)
    VALUES ('Taro Yamada', '[email protected]');
    
    SELECT * FROM users
    WHERE id = (
      SELECT id FROM users
      ORDER BY id DESC
      LIMIT 1
    );
    

    挿入された行を返すには、さまざまな方法があります。それぞれの方法には長所と短所があるので、状況に合わせて最適な方法を選択する必要があります。


      postgresql


      PostgreSQL: STRING_AGG関数 vs GROUP_CONCAT関数

      では、PostgreSQLで同様の処理を行うにはどうすれば良いのでしょうか? いくつか方法があります。PostgreSQLでは、STRING_AGG関数をGROUP_CONCATの代わりに使うことができます。STRING_AGG関数は、グループ化された行の列値を連結し、指定された区切り文字で区切ります。...


      PostgreSQL配列:=演算子、ANYキーワード、EXISTSキーワード、CONTAINS演算子、OVERLAPS`演算子

      = 演算子最も簡単な方法は、= 演算子を使用して、配列内の要素と比較することです。例:このクエリは、interests 列に 音楽 と 映画 という値を含むすべてのユーザーを返します。ANY キーワードを使用して、配列内の任意の要素と比較することもできます。...


      JSONデータの解析をもっと便利に!PostgreSQLの便利機能と сторонние ライブラリ

      json 型と jsonb 型PostgreSQLには、JSONデータを格納するための2つの型があります。json 型: 軽量で保存容量に優れていますが、一部の操作に非効率な場合があります。jsonb 型: json 型よりも処理速度が速く、インデックス付けや部分更新などの機能が充実しています。...


      データベース操作のヒント: PostgreSQL 関数で JSON データの二重引用符を駆除

      この問題を解決するには、JSON データから二重引用符を削除する必要があります。これには、いくつかの方法があります。PostgreSQL 9.5 以降には、json_strip_double_quotes 関数が導入されています。この関数は、JSON データからすべての二重引用符を削除します。...


      SQL SQL SQL Amazon で見る



      PostgreSQLにおけるINSERT...RETURNINGと他のSQLステートメントの組み合わせ

      概要PostgreSQLのINSERT. ..RETURNING句で挿入された行の情報を、別のINSERTステートメントで使用することは可能です。これにより、複数のテーブルへのデータ挿入を1つのトランザクションで効率的に行うことができます。