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')) );

参考


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

Last-modified: 2020-07-05 (日) 12:03:12