一种在多插入事务中引用ID的方法?(postgres)


8

假设表“ entity.eid”是自动递增的,我希望能够引用稍后在同一事务中分配的自动递增值。我这样做的方式是进行多次交易,我认为这不是最佳选择。

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

Answers:


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子句(aka Common Table Expressions)插入到一个子句中,然后引用该RETURNING子句中的值以执行更多操作(WITH子句可以链接在一起)。

文档WITH条款:http : //www.postgresql.org/docs/current/static/queries-with.html


4

值得注意的是,Postgres中的SERIAL只是一个以SEQUENCE作为默认值的INT ,您可以轻松地在事务中自己查询定序器,而不用插入允许默认值发生的表中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.