40002: transaction_integrity_constraint_violation
PostgreSQL의미
트랜잭션 끝에 검사되는 무결성 제약 조건이 COMMIT 시 위반된 경우의 SQL 표준 코드다. 중요: PostgreSQL은 실제로 이 코드를 생성하지 않으며, COMMIT 시 연기된(DEFERRED) 제약 조건 위반을 해당 제약 조건 자체의 코드로 반환한다: 외래 키는 23503, 고유성은 23505.
원인
DEFERRABLE INITIALLY DEFERRED로 정의된 외래 키나 unique 제약 조건이 트랜잭션의 중간 단계에서 일시적으로 깨진 후 COMMIT 시점까지 수정되지 않았다. PostgreSQL에서는 23503/23505로 보고된다. 예를 들어 상호 참조하는 행을 잘못된 순서로 삽입하고 수정하지 않으면 발생한다.
해결 방법
COMMIT 전에 모든 연기된 제약 조건이 충족되도록 트랜잭션 로직을 수정한다(누락된 참조 추가, 충돌 해소). 필요하면 트랜잭션 안에서 SET CONSTRAINTS ... IMMEDIATE로 제약 조건을 조기에 검사해 문제 단계를 더 빨리 찾는다. 상호 참조의 경우 삽입/갱신 순서를 조정한다.