使用max函数是否可以安全地获取字段的下一个值,就像在这里完成一样?
Custom auto-increment field in postgresql (Invoice/Order No.)
我问这个因为我需要生成类似的东西但是max函数会为并发用户返回不同的值吗?我承诺正在使用触发器,但同样,我不明白最大功能如何在这里安全。如果没有,应该使用什么?
谢谢你!答案 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,但咨询锁对服务器性能的负面影响较小。