max函数增加一个关键字段

时间:2017-10-06 14:47:37

标签: postgresql

使用max函数是否可以安全地获取字段的下一个值,就像在这里完成一样?

Custom auto-increment field in postgresql (Invoice/Order No.)

我问这个因为我需要生成类似的东西但是max函数会为并发用户返回不同的值吗?我承诺正在使用触发器,但同样,我不明白最大功能如何在这里安全。如果没有,应该使用什么?

谢谢你!

1 个答案:

答案 0 :(得分:0)

该方法不安全。无法保证两个并发会话不会获得相同的最大值,并且会尝试插入具有相同编号的行。

使用串行列(或显式序列)是更好的选择。它确保您获得唯一值,但不保证它们是连续的,请参阅PostgreSQL - next serial value in a table

如果必须保留最后一个条件,您可以使用advisory locks为此目的使用max()函数,例如:

begin;
select pg_advisory_xact_lock('my_table'::regclass::bigint);
-- a concurrent session waits here until the transaction completes
insert into my_table (id)
select max(id)+ 1 from my_table;
commit;

您还可以在表的访问独占模式下使用explicit lock,但咨询锁对服务器性能的负面影响较小。