このようなことは可能ですか?
INSERT INTO Table2 (val)
VALUES ((INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id));
戻り値を値として使用して、最初のテーブルへの参照を含む2番目のテーブルに行を挿入するようなものですか?
回答:
Postgres9.1からこれを行うことができます。
with rows as (
INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id
)
INSERT INTO Table2 (val)
SELECT id
FROM rows
それまでの間、IDのみに関心がある場合は、トリガーを使用して行うことができます。
create function t1_ins_into_t2()
returns trigger
as $$
begin
insert into table2 (val) values (new.id);
return new;
end;
$$ language plpgsql;
create trigger t1_ins_into_t2
after insert on table1
for each row
execute procedure t1_ins_into_t2();
rows
、(some_query returning ...)
最近はうまくいくかもしれません(試していません)。
この状況のベストプラクティス。を使用しRETURNING … INTO
ます。
INSERT INTO teams VALUES (...) RETURNING id INTO last_id;
これはPLPGSQL用であることに注意してください
RETURNING ... INTO
です。
次のlastval()
機能を使用できます。
nextval
任意のシーケンスで最後に取得された戻り値
だからこのようなもの:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (lastval());
これはnextval()
、INSERT間で(現在のセッションで)他のシーケンスを誰も呼び出さない限り、正常に機能します。
以下のようデニス下記留意し、私が使用して、上記について警告しlastval()
、別の配列を使用してアクセスされた場合は、トラブルにあなたを得ることができnextval()
、あなたのINSERTの間。これは、シーケンスTable1
で手動で呼び出さnextval()
れたものにINSERTトリガーがあった場合、SERIAL
またはBIGSERIAL
、または主キーを使用してテーブルでINSERTを実行した場合に発生する可能性があります。あなたが本当に妄想的になりたいのなら(良いこと、彼らは本当にあなたを連れて行くのです)、あなたは使うことができますcurrval()
が、あなたは関連するシーケンスの名前を知る必要があるでしょう:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (currval('Table1_id_seq'::regclass));
自動的に生成されたシーケンスは通常、命名されたt_c_seq
場所t
のテーブル名とc
列名ですが、あなたはいつもに行くことによって見つけることができますpsql
と言って:
=> \d table_name;
次に、問題の列のデフォルト値を確認します。次に例を示します。
id | integer | not null default nextval('people_id_seq'::regclass)
参考までに:lastval()
多かれ少なかれ、MySQLのPostgreSQLバージョンですLAST_INSERT_ID
。多くの人がPostgreSQLよりもMySQLに精通しているので、これについてのみ言及しますlastval()
。
lastval
トリガーからの背後にシーケンスベースのINSERTがある可能性があることです。それは現在のセッションにあり、おそらく、lastval()
予期しないときに変更されます。