SET CONSTRAINTS
SET CONSTRAINTS (SET CONSTRAINTS)
현재 트랜잭션의 제약 조건 검사 시점(timing)을 설정하는 명령이에요. IMMEDIATE 제약 조건은 각 문장 끝에 검사되고, DEFERRED 제약 조건은 트랜잭션 커밋 시점까지 검사가 미뤄져요.
출처: PostgreSQL 문서
본문
개요 (Synopsis)
SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }
설명 (Description)
SET CONSTRAINTS는 현재 트랜잭션 안에서 제약 조건 검사의 동작을 설정해요. IMMEDIATE 제약 조건은 각 문장 끝에 검사되고, DEFERRED 제약 조건은 트랜잭션이 커밋될 때까지 검사되지 않아요. 각 제약 조건은 고유한 IMMEDIATE 또는 DEFERRED 모드를 가집니다.
제약 조건은 생성될 때 DEFERRABLE INITIALLY DEFERRED, DEFERRABLE INITIALLY IMMEDIATE, NOT DEFERRABLE의 세 특성 중 하나를 부여받아요. 세 번째 부류는 항상 IMMEDIATE이며 SET CONSTRAINTS 명령의 영향을 받지 않아요. 첫 두 부류는 트랜잭션을 표시된 모드로 시작하지만, 그 동작은 SET CONSTRAINTS로 트랜잭션 안에서 바꿀 수 있습니다.
제약 조건 이름 목록을 가진 SET CONSTRAINTS는 그 제약 조건들(모두 deferrable이어야 함)의 모드만 바꿔요. 각 제약 조건 이름은 스키마 한정으로 쓸 수 있어요. 스키마 이름이 지정되지 않으면 현재 스키마 검색 경로(search path)를 사용해 첫 번째 일치 이름을 찾아요. SET CONSTRAINTS ALL은 모든 deferrable 제약 조건의 모드를 바꿔요.
SET CONSTRAINTS가 제약 조건의 모드를 DEFERRED에서 IMMEDIATE로 바꾸면, 새 모드는 소급 적용돼요. 즉 트랜잭션 끝에 검사될 예정이던 미해결 데이터 수정이 대신 SET CONSTRAINTS 명령이 실행되는 동안 검사됩니다. 그러한 제약 조건이 하나라도 위반되면 SET CONSTRAINTS는 실패해요(그리고 제약 조건 모드를 바꾸지 않아요). 따라서 SET CONSTRAINTS는 제약 조건 검사를 트랜잭션의 특정 시점에 강제로 수행하게 하는 데 쓸 수 있어요.
현재 UNIQUE, PRIMARY KEY, REFERENCES(외래 키), EXCLUDE 제약 조건만 이 설정의 영향을 받아요. NOT NULL과 CHECK 제약 조건은 행이 삽입되거나 수정될 때 항상 즉시 검사됩니다(문장 끝이 아니라). DEFERRABLE로 선언되지 않은 고유성·배제(exclusion) 제약 조건도 즉시 검사돼요.
"제약 조건 트리거(constraint trigger)"로 선언된 트리거의 발화도 이 설정으로 제어돼요 — 이들은 연관된 제약 조건이 검사되어야 할 때 같은 시점에 발화해요.
참고 (Notes)
PostgreSQL은 제약 조건 이름이 스키마 안에서 고유할 것을 요구하지 않기 때문에(테이블별로만 고유), 지정된 제약 조건 이름에 일치하는 것이 둘 이상일 수 있어요. 이 경우 SET CONSTRAINTS는 모든 일치 항목에 적용돼요. 스키마 한정이 아닌 이름이면, 검색 경로의 어떤 스키마에서 일치가 하나 이상 발견되면 경로에서 더 뒤에 나오는 스키마는 검색하지 않아요.
이 명령은 현재 트랜잭션 안에서만 제약 조건의 동작을 바꿔요. 트랜잭션 블록 밖에서 실행하면 경고가 나오고 그 외에는 아무 효과가 없어요.
호환성 (Compatibility)
이 명령은 SQL 표준에 정의된 동작을 준수해요. 다만 PostgreSQL에서는 NOT NULL과 CHECK 제약 조건에는 적용되지 않는다는 제한이 있어요. 또한 PostgreSQL은 non-deferrable 고유성 제약 조건을 표준이 시사하는 문장 끝이 아니라 즉시 검사해요.