您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

POSTGRES-使用ON CONFLICT防止序列递增不要这样做

POSTGRES-使用ON CONFLICT防止序列递增不要这样做

使用insert ... on conflict,您不能阻止serial冲突自动增加。Postgres(就像其他数据库一样)不保证序列是连续的,如文档中所述

因为smallserialserial并且bigserial使用序列实现时,可能有值的,其出现在列,即使没有行被彻底删除序列中的“洞”或间隙。即使从未成功将包含该值的行插入表列,也仍会“用完”从序列中分配的值。例如,如果插入事务回滚,则可能会发生这种情况。

如果您正在运行大量insert最终导致冲突的方法,则可以限制语法要求的一种方法是将语法更改为not exists

insert into things (name)
select name
from (values ('desk')) v(name)
where not exists (select 1 from things t1 where t1.name = v.name)

请注意,这仍然不能保证序列将是连续的(请参考文档中的以上引用)。

Postgres 2022/1/1 18:52:05 有480人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶