我不明白为什么postgres会提高:
duplicate key value violates unique constraint
我去检查pgadmin中的表格,看看表格是否确实有重复并看到:
建议运行VACUUM
表格中的估计行数与实际行数明显不同。
为什么会这样?幸运的是,它似乎没有发生在heroku的生产中。这是一个rails应用程序。
更新
这是sql日志:
SQL(2.6ms)INSERT INTO“favorites”(“artist_id”,“author_id”, “created_at”,“post_id”,“updated_at”)价值($ 1,$ 2,$ 3,$ 4,$ 5) 返回“id”[[“artist_id”,17],[“author_id”,nil],[“created_at”, 太阳,2012年3月18日03:48:37 UTC +00:00],[“post_id”,62],[“updated_at”, 太阳,2012年3月18日03:48:37 UTC +00:00]] PG ::错误:错误:重复 键值违反了唯一约束 “index_favorites_on_artist_id_and_post_id”详情:键(artist_id, post_id)=(17,62)已经存在。
但在实际的表格中没有art_id = 17和post_id = 62的记录。但是postgres认为有记录。
答案 0 :(得分:8)
您需要运行ANALYZE
才能使行计数同步。在pgAdmin中右键单击表格,然后选择“维护”。然后按表格上的F5
。
与唯一密钥违规无关。这意味着您尝试在UNIQUE
或PRIMARY KEY
约束的列中输入的值已存在于另一行中。
答案 1 :(得分:3)
如果出现PostgreSQL唯一密钥违规错误消息,ActiveRecord::Base.connection.reset_pk_sequence!('table_name')
可能有助于使密钥恢复同步。
答案 2 :(得分:2)
这种情况的一个常见原因是您将数据放入具有主键的表中,该主键通常由串行类型提供,但默认()后面的序列与表不同步。
答案 3 :(得分:0)
实际上我认为这个问题根本与postgres无关。它是同时重复的ajax调用的组合,创建了一个重复的记录,然后都没有插入。
答案 4 :(得分:0)
我在开发环境中遇到了这个问题。这对我有用phppgadmin->admin->reindex
。
我的解决方案很危险在某些情况下会更新整个数据库。我建议在生产环境中工作时查看其他解决方案。
但是,根据@Erwin Brandstetter
Analyse
是一个很好的开始方式