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

我不明白为什么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”)VALUES($ 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“,Sun ,2012年3月18日03:48:37 UTC +00:00]] PG ::错误:错误:重复键值违反唯一约束“index_favorites_on_artist_id_and_post_id”DETAIL:键(artist_id,post_id)=(17,62)已经存在。

但是在实际的表格中没有这样的记录,其中artist_id = 17和post_id = 62.但是postgres认为存在。

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

但是,与唯一的密钥违规没有任何关系。 这意味着您尝试在具有UNIQUEPRIMARY KEY约束的列中输入的值已存在于另一行中。

如果出现PostgreSQL唯一键冲突错误消息, ActiveRecord::Base.connection.reset_pk_sequence!('table_name')可能有助于使密钥恢复同步。

这种情况的一个常见原因是您将数据放入具有主键的表中,该主键通常由串行类型提供,但默认()后面的序列与表不同步。

实际上我认为这个问题根本与postgres无关。 它是同时重复的ajax调用的组合,创建了一个重复的记录,然后都没有插入。

我在开发环境中遇到了这个问题。 这对我phppgadmin->admin->reindex我的解决方案在某些情况下是危险的 ,因为它更新整个数据库。我建议在生产环境中工作时查看其他解决方案。 但是,按照@Erwin Brandstetter的建议, Analyse是一个很好的开始