本地postgres db不断给出错误重复键值违反唯一约束

时间:2012-03-17 07:29:33

标签: ruby-on-rails postgresql heroku duplicates

我不明白为什么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认为有记录。

5 个答案:

答案 0 :(得分:8)

您需要运行ANALYZE才能使行计数同步。在pgAdmin中右键单击表格,然后选择“维护”。然后按表格上的F5

与唯一密钥违规无关。这意味着您尝试在UNIQUEPRIMARY 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是一个很好的开始方式