PostgreSQL:在插入失败的约束上增加SERIAL

22

拥有这样简单的表格结构:

CREATE TABLE test (
    id INT PRIMARY KEY,
    sid SERIAL
);

我注意到,如果我尝试插入一行数据,但失败了约束测试(例如主键约束),则SERIAL计数器仍会增加,因此下一个成功的插入将使sid变为sid + 2而不是sid + 1

这种现象是否正常?有没有防止它发生的办法?

1个回答

45

是的,这是有意设计的。 Serial 数据类型使用序列,这种行为在文档中有描述(序列操作函数):

为了避免阻止从相同序列获取数字的并发事务,nextval 操作永远不会回滚;也就是说,一旦获取了一个值,即使执行 nextval 的事务稍后中止,该值也被认为是已使用的。这意味着中止的事务可能会在分配的值序列中留下未使用的“空洞”。

没有有效的方法可以防止它。但是,您可以通过创建一个单行表并在获取下一个值时锁定它来开发自己的序列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接