【初心者向け】PostgreSQLで挿入データを楽々ゲット! RETURNING句のしくみとサンプルコード
PostgreSQLで挿入された行を返す
基本的な構文
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
RETURNING column1, column2, ...;
この構文では、table_name
テーブルに新しい行が挿入され、column1
、column2
などの列にそれぞれvalue1
、value2
などの値が設定されます。RETURNING
句によって、column1
、column2
などの列の値が返されます。
すべての列の値を返すには、*
を使用します。
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