2012-02-16 54 views
8

我已经看到更新序列的解决方案,当它与其生成的主键不同步时,但我不明白这个问题是如何发生的。为什么SQL ID序列不同步(特别是使用Postgres)?

有没有人知道如何将主键字段与默认定义为序列的nextval的主键没有明确地设置在任何地方,可以不同步的序列?我使用的是Postgres,我们偶尔会发现这种情况。当序列为现有行生成一个id时,它最终会产生重复键约束。

+1

经过一番研究,在我的特殊情况下,它实际上是一个Hibernate映射,它生成自己的ID并忽略序列。不知道在这种情况下是否应该删除问题 - 看起来像其他人遇到同样的问题。 – Jake 2012-02-16 17:03:24

+2

你可以回答你自己的问题。除非您(或某些中间件)不使用序列为部分或全部行生成主键,否则序列实际上没有办法“不同步”。 – nos 2012-02-16 17:53:54

回答

8

您的应用程序可能偶尔会为新行设置主键的值。然后postgresql不需要获得一个新的序列,并且序列不会被更新。

+1

这是正确的 - hibernate映射忽略了序列,所以当非hibernate应用程序插入一行让序列生成id时,序列已过期。 – Jake 2012-03-08 22:49:23

0

当分配了一个序列号时,即使回送了请求的TX也会保持分配状态。因此,可以分配一个不出现在稳定数据库中的数字。当然,行也可以在创建后被删除,所以表中找到的最大数量不一定是分配的最大数量。这适用于任何自动递增类型。

另外,根据所使用的技术,单独的序列可以与多个表一起使用,因此TableA中可能会丢失一个值,但会出现在TableB中。这可能是因为使用序列名称时出现错误,或者可能是故意的。

+1

这不是这个问题的答案。 – Tometzky 2012-02-18 11:43:36

相关问题