CTEでINSERTされた行のデータを別のINSERTに使う
前提
CREATE TABLE category ( category_id serial primary key, category_name text );
CREATE TABLE item ( item_id serial primary key, item_name text, category_id int );
- categoryテーブルにレコードを挿入後、そのレコードのプライマリーキーのcategory_idを使って別のテーブルであるitemテーブルにレコードを挿入する
CTEを使う場合
WITH category_cte AS (
INSERT INTO category ( category_name ) VALUES ( 'cat_a' )
RETURNING category_id
)
INSERT INTO item ( item_name, category_id )
SELECT 'item_a', category_id FROM category_cte;
- categoryテーブルにINSERTするCommon Table Expression(CTE)を作り、その中でRETURNINGでcategory_idを返す
- itemテーブルのINSERTにはCTEが返すデータを使う
シーケンスを参照する場合
lastval()
INSERT INTO category ( category_name ) VALUES ( 'cat_b' );
INSERT INTO item ( item_name, category_id ) VALUES ( 'item_b', lastval() );
currval()
INSERT INTO category ( category_name ) VALUES ( 'cat_c' );
INSERT INTO item ( item_name, category_id ) VALUES ( 'item_c',
currval(pg_get_serial_sequence('category', 'category_id')) );
参考