40002: transaction_integrity_constraint_violation
PostgreSQL意味
トランザクション終了時にチェックされる整合性制約が COMMIT 時に違反されたことを示す SQL 標準のコード。重要: PostgreSQL は実際にはこのコードを生成せず、COMMIT 時の遅延 (DEFERRED) 制約違反を制約自身のコードで返す: 外部キーは 23503、一意性は 23505。
原因
DEFERRABLE INITIALLY DEFERRED で定義された外部キーまたは一意制約が、トランザクションの途中のステップで一時的に破られ、COMMIT 時までに修正されなかった。PostgreSQL ではこれは 23503/23505 として報告される。例えば、相互に参照する行を誤った順序で挿入し、修正しなかった場合に発生する。
対処方法
COMMIT 前にすべての遅延制約が満たされるようトランザクションのロジックを修正する (欠けている参照を追加し、競合を解消する)。必要に応じて、トランザクション内で SET CONSTRAINTS ... IMMEDIATE により制約を早期にチェックし、問題のあるステップを早く検出する。相互参照の場合は挿入/更新の順序を入れ替える。