23001: restrict_violation
PostgreSQL의미
SQL 표준 restrict_violation 코드다. 중요: PostgreSQL은 ON DELETE/ON UPDATE RESTRICT 또는 NO ACTION으로 정의된 외래 키 위반을 이 코드가 아니라 23503(foreign_key_violation)으로 보고한다. 실제로 PostgreSQL 코어에서 이 코드를 볼 일은 없다.
원인
종속 자식 행이 있는 부모 행을 삭제하거나 키를 변경하면 PostgreSQL은 23503을 반환한다. 23001은 보통 다른 데이터베이스에서 이식한 애플리케이션 코드나 확장의 사용자 정의 오류로 나타난다. NO ACTION과 달리 RESTRICT는 검사를 트랜잭션 끝으로 연기할 수 없고 즉시 실패한다.
해결 방법
먼저 종속 자식 행을 삭제/갱신하거나 다른 부모로 옮긴 후 부모 행을 처리한다. 비즈니스 규칙이 허용한다면 외래 키를 ON DELETE CASCADE 또는 SET NULL로 재정의하는 것을 고려한다. 대량 삭제에서는 삭제 순서를 올바르게 한다(자식 먼저, 그다음 부모).