4

我在 postgresql 上有一个问题,我认为 postgresql 中有一个错误,我错误地实现了一些东西。

有一个表,包括colmn1(primary key), colmn2(unique), colmn3, ...

插入一行后,如果我尝试使用现有colmn2值进行另一次插入,我会得到我预期的重复值错误。但是在这次不成功colmn1的尝试之后,尽管没有插入,但下一个值会增加 1,所以我得到的行具有 id 序列,例如 ,1,2,4,6,9.(3,5,6,7,8用于不成功的试验)。

我需要能够解释这种奇怪行为的人的帮助。

此信息可能有用:我使用“ create unique index on tableName (lower(column1))”查询来设置唯一约束。

4

2 回答 2

9

请参阅PostgreSQL 序列常见问题解答

序列旨在生成唯一标识符——不一定是严格顺序的标识符。如果两个并发的数据库客户端都试图从一个序列中获取一个值(使用 nextval()),每个客户端都会得到一个不同的序列值。如果其中一个客户端随后中止其事务,则为该客户端生成的序列值将未被使用,从而在序列中产生间隙。

在不导致显着性能损失的情况下,这不能轻易解决。有关详细信息,请参阅 General Bits Newsletter 中的 Elein Mustein 的“主键的无缝序列”。

于 2012-09-14T11:06:00.397 回答
3

手册

重要提示:因为序列是非事务性的,所以如果事务回滚,setval 所做的更改不会撤消。

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

于 2012-09-14T12:44:52.990 回答