想象一下,您有一个Amazon Aurora Postgres数据库。您在一张表中执行INSERT。然后,您需要执行SELECT才能获取新添加记录的自动生成的CompanyId
。您确定在INSERT发生与记录可用于运行SELECT的时间之间通常存在足够大的延迟。
我已经与同事讨论了一些可能的代码模式,以最好地处理此滞后时间。您认为最好的方法是什么?
答案 0 :(得分:1)
您不需要单独的SELECT语句。最好和最有效的选择是只使用returning
子句:
insert into some_table (c1, c2, c3)
values (...)
returning *;
除了returning *
之外,您还可以指定所需的列,例如:returning company_id
另一种选择是在插入后直接使用currval()
或lastval()
来获取序列的值:
insert into some_table (..)
values (...);
select lastval();
使用lastval()
要求INSERT和SELECT之间的不同顺序不会生成其他值。如果不能保证,请使用currval()
并指定序列的名称:
insert into some_table (...)
values (...);
select currval('some_table_company_id_seq');
如果要避免对序列名称进行硬编码,请使用pg_get_serial_sequence()
select currval(pg_get_serial_sequence('some_table', 'company_id'));