如何更新 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 唯一键约束的主要内容,如果未能解决你的问题,请参考以下文章