ERROR: duplicate key value violates unique constraint
PostgreSQLでユニーク制約違反が発生した際のエラー
概要
PostgreSQLで主キー(PRIMARY KEY)またはユニーク制約(UNIQUE)が設定されたカラムに、既に存在する値を挿入しようとした際に発生するエラーです。
エラーメッセージ
ERROR: duplicate key value violates unique constraint "users_pkey"
DETAIL: Key (id)=(1) already exists.
ERROR: duplicate key value violates unique constraint "users_email_key"
DETAIL: Key (email)=(user@example.com) already exists.
原因
- 主キーの重複: 既に存在するIDで挿入しようとしている
- ユニーク制約違反: ユニークカラムに重複値を挿入
- シーケンスのずれ: SERIALカラムのシーケンスが実データとずれている
- 並行トランザクション: 同時に同じ値を挿入
- データ移行: インポートデータに重複がある
解決策
1. ON CONFLICT DO NOTHINGを使用
| |
2. ON CONFLICT DO UPDATEを使用(UPSERT)
| |
3. 複合キーでのON CONFLICT
| |
4. シーケンスをリセット
| |
5. 挿入前に存在確認
| |
6. CTEを使用したUPSERT
| |
7. Laravelでの対処
| |
8. Rails/ActiveRecordでの対処
| |
9. 重複データの調査
| |
トランザクション内での対処
| |
よくある間違い
pg_dumpでリストア時にシーケンスがリセットされないCOPYコマンドでインポート時に重複チェックをしない- ON CONFLICTで制約名を間違える
関連エラー
参考リンク
PostgreSQL の他のエラー
この記事は役に立ちましたか?