다른 (정확한) 답변 외에도 PostgreSQL에 대해 말할 때 다음과 같이 명시해야합니다.
와 NOT DEFERRABLE 각 행은 삽입 / 업데이트시 체크
와 DEFERRABLE (현재 IMMEDIATE ) 모든 행은 삽입 / 업데이트의 마지막에 체크
와 DEFERRABLE (현재 DEFERRED ) 모든 행이 트랜잭션의 끝에서 확인됩니다
따라서 DEFERRABLE 제약 조건이 IMMEDIATE로 설정 될 때 NOT DEFERRABLE 제약 조건처럼 작동한다고 말하는 것은 올바르지 않습니다.
이 차이점에 대해 자세히 설명하겠습니다.
CREATE TABLE example(
row integer NOT NULL,
col integer NOT NULL,
UNIQUE (row, col) DEFERRABLE INITIALLY IMMEDIATE
);
INSERT INTO example (row, col) VALUES (1,1),(2,2),(3,3);
UPDATE example SET row = row + 1, col = col + 1;
SELECT * FROM example;
그러면 다음이 올바르게 출력됩니다.
그러나 DEFERRABLE INITIALLY IMMEDIATE 명령을 제거하면
오류 : 중복 키 값이 "example_row_col_key"고유 제약 조건을 위반합니다. DETAIL : 키 ( "row", col) = (2, 2)가 이미 있습니다. ********** 오류 **********
오류 : 중복 키 값이 고유 제약 조건 "example_row_col_key"를 위반합니다. SQL 상태 : 23505 세부 정보 : 키 ( "row", col) = (2, 2)가 이미 있습니다.
부록 (2017 년 10 월 12 일)
이 동작은 실제로 여기 "호환성"섹션에 설명되어 있습니다 .
또한 PostgreSQL은 표준이 제안하는 것처럼 명령문의 끝이 아니라 지연 불가능한 고유성 제약 조건을 즉시 확인합니다.
DEFERRABLE
제약 조건을 연기하는 것이 가치가 있거나 필요한 조치라는 디자이너의 의도를 나타냅니다. 대부분의 데이터베이스 제약 조건과 레이블링DEFERRABLE
은이 유용한 구별을 잃게 되는 경우가 아닙니다 .