【问题标题】:SQL issue: Duplicate key value violates unique constraintSQL 问题:重复键值违反唯一约束
【发布时间】:2020-05-03 18:21:21
【问题描述】:

我在 PGAdmin4 上运行 Postgres10

要查看我的数据库是否不同步,我正在检查我的主键和主键序列。

我正在运行这个查询来检查主键:

  • MAX(sid) FROM schema_name.table_name; 返回 1032

    • sid是主键

    • 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 值是否是连续的?它们只需要不同
  • 当心,nextval modifies the sequence,所以运行该命令无论如何都会取消同步。您可能想要currval。除此之外,忽略序列中的表观值。将它们视为“内存地址”,就像在 C++ 之类的语言中使用指针一样:“值”是没有意义的,并且超出了您的控制范围。
  • 由于序列大于表上的最大 id,因此您必须从其他一些唯一键获取 SQL issue: Duplicate key value violates unique constraint。除非您现在在序列上查询 nextval 足够多次,否则插入不会再产生错误。

标签: sql postgresql-10


【解决方案1】:

当自定义程序将记录记录插入表中并采用last_key_value + 1 而另一个程序正在使用序列nextval 插入时,我遇到了密钥与序列不同步的问题表。

这可能会产生重复键问题。

我会检查以确保您没有存在此冲突的程序。

完全规避此类问题的更好方法是使用IDENTITY 类型列。虽然我不知道 Postgres 是否支持这种数据类型。

【讨论】:

    猜你喜欢
    • 2022-09-28
    • 1970-01-01
    • 2022-01-13
    • 2020-03-27
    • 2013-06-23
    • 2016-06-12
    • 2013-03-15
    • 2016-11-27
    • 2018-03-14
    相关资源
    最近更新 更多