【发布时间】:2020-05-03 18:21:21
【问题描述】:
我在 PGAdmin4 上运行 Postgres10
要查看我的数据库是否不同步,我正在检查我的主键和主键序列。
我正在运行这个查询来检查主键:
-
MAX(sid) FROM schema_name.table_name;返回 1032sid是主键
schema_name 是我的表所在的架构
table_name 是违反唯一约束的表的名称
我正在运行这个查询来检查主键序列:
-
SELECT nextval(pg_get_serial_sequence('schema_name.table_name', 'sid'));返回 1042(当前值为 1041)。
引用这个 SO:我引用这个堆栈溢出:postgresql duplicate key violates unique constraint
但该帖子已有 9 年历史,解决方案仅检查主键的最大值是否大于序列的下一个值(在我的情况下不是)。
【问题讨论】:
-
我不明白为什么主键和序列必须相互关联。你熟悉
delete吗?我也看不出这个检查与帖子的标题有什么关系。 -
行可以从表中删除,但nextval不会改变。您是否对表进行任何审核以查看是否删除了行?
-
你为什么关心
sid值是否是连续的?它们只需要不同。 -
当心,
nextvalmodifies the sequence,所以运行该命令无论如何都会取消同步。您可能想要currval。除此之外,忽略序列中的表观值。将它们视为“内存地址”,就像在 C++ 之类的语言中使用指针一样:“值”是没有意义的,并且超出了您的控制范围。 -
由于序列大于表上的最大 id,因此您必须从其他一些唯一键获取
SQL issue: Duplicate key value violates unique constraint。除非您现在在序列上查询 nextval 足够多次,否则插入不会再产生错误。
标签: sql postgresql-10