如何更新 postgreSQL 唯一键约束

Posted

技术标签:

【中文标题】如何更新 postgreSQL 唯一键约束【英文标题】:How to update an a postgreSQL unique key constraint 【发布时间】:2015-08-17 02:14:33 【问题描述】:

我的应用程序中不断收到此错误

重复键值违反唯一约束“product_supplierinfo_pkey” 详细信息:键 (id)=(409) 已存在。

这是在表 product_supplierinfo 上。

键约束需要的实际下一个序列号是 5461 而不是 409。

谁能告诉我正确的查询来更新这个键唯一约束?

【问题讨论】:

编辑您的问题并包含查询。 我不知道问题所在的查询? 您的应用程序从哪里获得id 值?这是插入还是更新? id 是从序列中获取其默认值吗? 这是一个名为 product_supplierinfo 的 postgreSQL 表,它有一个名为 product_supplierinfo_pkey 的约束,每次添加记录时都会更新此数字。然而,我直接导入到数据库中,它抛出了约束计数器。它认为下一个 id 号是 409,应该是 5461。 【参考方案1】:

@chris Collins,请发布\d product_supplierinfo 的输出。我想你用id serial 创建了这张表。

您应该会看到 id 字段的下一个默认值将来自的序列名称。可能是product_supplierinfo_id_seq

然后做,假设上面的名字是正确的,SELECT * from product_supplierinfo_id_seq;。您可能会看到下一个值是 410。

如果这一切都正确,请执行SELECT setval('product_supplierinfo_id_seq', 5461);

【讨论】:

@chris collins,要么表中存在高于 5460 的值,要么主键索引已过期。您可以查看SELECT max(id) from product_supplierinfo; 主键索引过期了如何​​解决? 如果上面给出 5460,试试REINDEX product_supplierinfo;。无论哪种方式,我都强烈建议您深入了解数据库处于不一致状态的原因。 我不仅重新索引了表,还重新索引了整个数据库。我还清空了数据库。虽然现在重复尝试的数字是 5469,但我仍然收到错误消息。 这是在 psql 会话中发生的,还是通过数据库支持的 webapp 发生的?在任何一种情况下,发布查询都会有所帮助,我认为这是一个 INSERT。您可以查看 Postgres 日志文件,除非有人修改了设置,否则您会找到导致错误的查询。

以上是关于如何更新 postgreSQL 唯一键约束的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql多个表具有相同的外键唯一约束

postgresql 重复键违反唯一约束

重复键违反唯一约束

postgresql----数据库表约束----UNIQUE

如何查找给定列是不是存在唯一键约束

通过实体框架更新时如何绕过唯一键约束(使用 dbcontext.SaveChanges())