複数挿入トランザクションでIDを参照する方法は?(postgres)


8

テーブル "entity.eid"が自動インクリメントであると仮定すると、同じトランザクションで後で割り当てられた自動インクリメント値を参照できるようにしたいと思います。私がこれを行っている方法は、私が最適ではないと思う複数のトランザクションを実行することです。

START TRANSACTION;
INSERT INTO entity ...;
INSERT INTO t2 (eid, ...) VALUES (?NEW EID REF HERE?, ...), (...), (...);
COMMIT;

回答:


11

これにはさまざまな方法があります。

最も簡単な方法は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


7

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


4

PostgresのSERIALがデフォルト値としてのSEQUENCEを持つ単なるINTであることは注目に値します。テーブルに挿入してデフォルトを実行する代わりに、トランザクションでシーケンサーを自分で簡単にクエリできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.