このようなことは可能ですか?
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()予期しないときに変更されます。