Postgresql:SERIAL在失败的约束INSERT上递增

时间:2016-03-07 17:19:32

标签: sql postgresql

有一个像这样的简单表结构:

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

我注意到如果我尝试插入一行但是它没有通过约束测试(即PRIMARY KEY约束),SERIAL计数器仍会递增,所以下一个成功的插入sid将是{ {1}}代替sid + 2

这是正常行为吗?有什么方法可以防止这种情况吗?

1 个答案:

答案 0 :(得分:14)

是的,这是设计的。 Serial数据类型使用序列,文档(Sequence Manipulation Functions)中描述了此行为:

  

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

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