2016-03-07 38 views
2

有一个简单的表结构是这样的:PostgreSQL的:SERIAL递增失败约束INSERT

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

我发现,如果我试图插入行,但它没有一个约束测试(即PRIMARY KEY约束),则SERIAL计数器无论如何都会增加,因此下一次成功插入sid将是sid + 2而不是sid + 1

这是正常的行为吗?任何方式来防止这种情况?

回答

9

是的,它是由设计。 Serial数据类型使用序列和这种行为的文件(Sequence Manipulation Functions)中描述:

为了避免阻断获得来自 相同序列号并发事务,nextval操作是从未回滚;也就是说,一旦 已取得一个值,即使后续执行nextval的 事务中止,它也被视为使用。这意味着,中止 事务可能会在分配的 值序列中留下未使用的“漏洞”。

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