回答:
これにはさまざまな方法があります。
最も簡単な方法はlastval()
、「最後の」シーケンスnextvalによって生成された値を返す関数を使用することです。
START TRANSACTION;
INSERT INTO entity ...;
INSERT INTO t2 (eid, ...) VALUES (lastval(), ...), (...), (...);
COMMIT;
entity
テーブルのシーケンスの名前がわかっている場合は、次のcurrval
関数も使用できます。
START TRANSACTION;
INSERT INTO entity ...;
INSERT INTO t2 (eid, ...) VALUES (currval('entity_eid_seq'), ...), (...), (...);
COMMIT;
これは、pg_get_serial_sequence()
関数を使用してより一般的な方法で記述でき、シーケンス名をハードコードする必要がありません。
START TRANSACTION;
INSERT INTO entity ...;
INSERT INTO t2 (eid, ...) VALUES (currval(pg_get_serial_sequence('entity', 'eid')), ...), (...);
COMMIT;
詳細については、マニュアルを参照してください:http : //www.postgresql.org/docs/current/static/functions-sequence.html
Postgresqlのバージョンは指定しませんが、8.4以降を使用している場合は、 RETURNING
句を挿入されたばかりのID(または任意の列)を返す。
ドキュメント:http : //www.postgresql.org/docs/current/static/sql-insert.html
例:
INSERT INTO t2 (eid, ...) VALUES (...) RETURNING eid;
Postgresqlバージョン9.1+を使用している場合は、WITH
句(別名Common Table Expressions
)を使用して1つの句に挿入し、次にRETURNING
句してより多くのアクションを実行することもできます(WITH句は連鎖できます)。
WITH
条項に関する文書:http : //www.postgresql.org/docs/current/static/queries-with.html
PostgresのSERIALがデフォルト値としてのSEQUENCEを持つ単なるINTであることは注目に値します。テーブルに挿入してデフォルトを実行する代わりに、トランザクションでシーケンサーを自分で簡単にクエリできます。