23P01: exclusion_violation
PostgreSQL의미
EXCLUDE(배제) 제약 조건을 위반했다. 이 제약 조건 유형은 특정 연산자(예: 범위 중첩 &&)에 따라 두 행이 충돌하지 않도록 하며, 삽입/갱신된 행이 기존 행과 충돌해 거부되었다.
원인
보통 GiST 기반 EXCLUDE 제약 조건이 정의되어 있고(예: 예약/회의실 예약에서 tstzrange &&로 시간 중첩 금지), 새 행의 범위/값이 기존 행과 겹치는 경우다. 두 동시 트랜잭션이 겹치는 범위를 삽입할 때도 발생할 수 있다.
해결 방법
삽입 전에 쿼리로 중첩 여부를 확인하거나, 애플리케이션에서 오류를 잡아 사용자에게 의미 있는 메시지를 보여 준다. 해당 범위/조건을 조회해 충돌하는 기존 행을 찾는다. 비즈니스 규칙이 중첩을 허용한다면 제약 조건을 완화하고, 그렇지 않으면 입력을 수정한다. 동시성 상황에서는 트랜잭션을 안전하게 재시도해 직렬화한다.