关于rails上的ruby:本地postgres db不断给出错误重复键值违反了唯一约束

local postgres db keeps giving error duplicate key value violates unique constraint

我不明白为什么postgres会提高:

1
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)
RETURNING"id" [["artist_id", 17], ["author_id", nil], ["created_at",
Sun, 18 Mar 2012 03:48:37 UTC +00:00], ["post_id", 62], ["updated_at",
Sun, 18 Mar 2012 03:48:37 UTC +00:00]] PG::Error: ERROR: duplicate
key value violates unique constraint
"index_favorites_on_artist_id_and_post_id" DETAIL: Key (artist_id,
post_id)=(17, 62) already exists.

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


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

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


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


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


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


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