に違反エラー重複したキー値を与え続け:ローカル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があることを信じています。
このエラーがいつ発生するのかについて少し具体的にお考えください。鍵違反が重複してもテーブルに重複は残らないが、挿入や更新が失敗する可能性があります。 Vacuumのことは無関係です。あなたは自動真空を調べる必要があります(バージョンによっては自動的にスケジュールされた作業を真空に設定します)。 –
質問をいくつかの例で更新しました。 – Homan
通常、後に1つのキーが存在することが予想されますが、sketchfemmeが答えで示しているように、同時のステートメントが問題になることがあります。同じトランザクションで同じキーを2回追加しようとすると、トランザクション全体がロールバックされ、どちらの行もテーブルに残りません。 post_idがシーケンスによって割り当てられていない理由はありますか? –