【问题标题】:Why do SQL id sequences go out of sync (specifically using Postgres)?为什么 SQL id 序列不同步(特别是使用 Postgres)?
【发布时间】:2012-02-16 15:49:23
【问题描述】:

我已经看到了在序列与其生成的主键不同步时更新序列的解决方案,但我不明白这个问题最初是如何发生的。

有没有人了解主键字段(其默认定义为序列的 nextval,其主键未在任何地方明确设置)如何与序列不同步?我正在使用 Postgres,我们时不时会看到这种情况。当序列为现有行生成 id 时,它最终会导致重复键约束。

【问题讨论】:

  • 经过一些研究,在我的特殊情况下,它实际上是一个 Hibernate 映射,它生成了自己的 ID 并忽略了序列。不确定在这种情况下我是否应该删除该问题 - 其他人似乎遇到了同样的问题。
  • 你可以回答你自己的问题。除非您(或某些中间件)不使用序列为部分或所有行生成主键,否则序列确实没有办法“不同步”。

标签: sql postgresql sequence


【解决方案1】:

您的应用程序可能偶尔会设置新行的主键值。那么postgresql就不需要获取新的序列,序列也不会更新。

【讨论】:

  • 这是正确的 - 休眠映射忽略了序列,因此当非休眠应用程序插入一行让序列生成 id 时,序列已过期。
【解决方案2】:

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

此外,根据所使用的技术,单独的序列可以用于多个表,因此表 A 中可能缺少一个值,但表 B 中存在。这可能是因为序列名称使用错误,也可能是故意的。

【讨论】:

  • 这不是这个问题的答案。
猜你喜欢
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
相关资源
最近更新 更多