2012-03-17 7 views
4

に違反エラー重複したキー値を与え続け:ローカルPostgresのDBは、Postgresが上げている理由を私は理解していないユニーク制約

duplicate key value violates unique constraint 

私はテーブルが実際に複製を持っていたかどうかを確認するためにpgAdminでのテーブルをチェックするために行ってきましたそして以下を参照してください

はVACUUMを実行すると、テーブルの上に

推定行数は、実際の行数から著しく逸脱お勧めします。

どうしてですか?幸いにも、それはヒロクでの生産では起こりそうにありません。それはレールアプリです。

アップデート:ここで

は、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があることを信じています。

+0

このエラーがいつ発生するのかについて少し具体的にお考えください。鍵違反が重複してもテーブルに重複は残らないが、挿入や更新が失敗する可能性があります。 Vacuumのことは無関係です。あなたは自動真空を調べる必要があります(バージョンによっては自動的にスケジュールされた作業を真空に設定します)。 –

+0

質問をいくつかの例で更新しました。 – Homan

+0

通常、後に1つのキーが存在することが予想されますが、sketchfemmeが答えで示しているように、同時のステートメントが問題になることがあります。同じトランザクションで同じキーを2回追加しようとすると、トランザクション全体がロールバックされ、どちらの行もテーブルに残りません。 post_idがシーケンスによって割り当てられていない理由はありますか? –

答えて

0

実際に私はこの問題はポストグルとは全く関係がないと思います。これは重複したAjax呼び出しの組み合わせで、重複するレコードを作成し、それからどちらも挿入されませんでした。

8

行数を同期させるには、ANALYZEを実行する必要があります。 pgAdminで、テーブルを右クリックし、そのメンテナンスを選択します。次に、表のF5を押します。

ただし、一意のキー違反とは関係ありません。つまり、UNIQUEまたはPRIMARY KEYという制約がある列に入力しようとしている値は、すでに別の行に存在しています。

+0

偉大な答えは、あなたの助けに感謝します。 – professormeowingtons

2

一般的な原因は、通常、シリアルタイプによって提供されるプライマリキーを使用してテーブルにデータを入れたが、default()の後ろのシーケンスはテーブルと同期していないということです。

3

PostgreSQL固有のキー違反のエラーメッセージの場合は、ActiveRecord::Base.connection.reset_pk_sequence!('table_name')がキーを同期させるのに役立つかもしれません。

0

この問題は私の開発環境で発生しました。これは私のために働いたphppgadmin->admin->reindex私のソリューションはデータベース全体を更新するため、状況によってはが危険です。私は、実稼働環境で作業するときには他のソリューションも見てみることをお勧めします。 しかし、Analyseは、@Erwin Brandstetterの提案のように始めるのが良い方法です。

関連する問題