Postgresql自增序列(serial)出现错误

4
我在postgresql上遇到了一个问题,我认为这是postgresql中的一个bug,我错误地实现了一些东西。
有一个表,包括colmn1(主键)colmn2(唯一)colmn3等列。
插入一行后,如果我尝试使用现有的colmn2值进行另一个插入,则会出现重复值错误,就像我预期的那样。但是,在此不成功的尝试之后,colmn1的下一个值增加了1,尽管没有插入,所以我得到的id序列行如:1,2,4,6,9。(3,5,6,7,8用于不成功的尝试)。
我需要从能够解释这种奇怪行为的人那里获得帮助。
这些信息可能有用:我使用“create unique index on tableName (lower(column1))”查询设置唯一约束。
2个回答

8
请参阅PostgreSQL序列FAQ
序列用于生成唯一标识符,而不是严格顺序的标识符。如果两个并发的数据库客户端都尝试从序列中获取值(使用nextval()),每个客户端都将获得不同的序列值。如果其中一个客户端随后中止其事务,则为该客户端生成的序列值将未被使用,从而在序列中创建间隙。
这很难在不产生重大性能损失的情况下解决。有关更多信息,请参见Elein Mustein在General Bits Newsletter中的"无间隙的主键序列"。

3

来自手册

重要提示:由于序列是非事务性的,如果事务回滚,setval所做的更改不会被撤销。

换句话说,有间隔是正常的。如果不想有间隔,请不要使用序列。


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