假设表“entity.eid”是自动递增的,我希望能够引用稍后在同一事务中分配的自动递增值。我一直这样做的方式是进行我认为不是最佳的多个交易。
START TRANSACTION;
INSERT INTO entity ...;
INSERT INTO t2 (eid, ...) VALUES (?NEW EID REF HERE?, ...), (...), (...);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
a_h*_*ame 11
有不同的方法可以做到这一点。
最简单的方法是使用lastval()
将返回“最后一个”序列 nextval 生成的值的函数。
START TRANSACTION;
INSERT INTO entity ...;
INSERT INTO t2 (eid, ...) VALUES (lastval(), ...), (...), (...);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
如果您知道entity
表的序列名称,也可以使用该currval
函数:
START TRANSACTION;
INSERT INTO entity ...;
INSERT INTO t2 (eid, ...) VALUES (currval('entity_eid_seq'), ...), (...), (...);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
这可以通过使用pg_get_serial_sequence()
函数以更通用的方式编写,避免对序列名称进行硬编码:
START TRANSACTION;
INSERT INTO entity ...;
INSERT INTO t2 (eid, ...) VALUES (currval(pg_get_serial_sequence('entity', 'eid')), ...), (...);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
更多详情请看手册: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
)将插入到一个子句中,然后引用子句中的值RETURNING
来执行更多操作(WITH 子句可以链接在一起)。
关于WITH
条款的文档:http : //www.postgresql.org/docs/current/static/queries-with.html