我已经看到了在序列与它生成的主键不同步时更新序列的解决方案,但我不明白这个问题是如何发生的。
有没有人能够深入了解主键字段的默认定义为序列的nextval,其主键未在任何地方显式设置,可能与序列不同步?我正在使用Postgres,我们看到这种情况时不时发生。当序列为现有行生成id时,它最终会产生重复键约束。
答案 0 :(得分:9)
您的应用程序可能偶尔会为新行设置主键的值。然后postgresql不需要获取新序列,序列也不会更新。
答案 1 :(得分:0)
当分配序列号时,即使请求它的TX被回滚,它仍然被分配。因此可以分配一个未出现在稳定数据库中的数字。当然,也可以在创建行后删除行,因此表中找到的最大数量不必是分配的最大数量。这适用于任何自动递增类型。
此外,根据所使用的技术,单独的序列可以与多个表一起使用,因此TableA中可能缺少一个值,但在TableB中存在。这可能是因为使用序列名称时出错,或者可能是故意的。