[postgresql] Postgresql : 조건부 고유 제약 조건

테이블의 일부에서만 열에 고유성을 적용하는 제약 조건을 추가하고 싶습니다.

ALTER TABLE stop ADD CONSTRAINT myc UNIQUE (col_a) WHERE (col_b is null);

WHERE위 의 부분은 희망찬 생각입니다.

이렇게하는 방법은 없나요? 아니면 관계형 드로잉 보드로 돌아 가야합니까?



답변

PostgreSQL은 부분 (즉, 조건부) UNIQUE제약 조건을 정의하지 않지만 부분 고유 인덱스를 생성 할 있습니다 . PostgreSQL은 고유 한 인덱스를 사용하여 고유 한 제약 조건을 구현하므로 효과는 동일하며에 나열된 제약 조건을 볼 수 없습니다 .information_schema

CREATE UNIQUE INDEX stop_myc ON stop (col_a) WHERE (col_b is NOT null);

부분 색인을 참조하십시오 .


답변

PG는 부분적인 (즉, 조건부) UNIQUE 제약 조건을 정의하지 않는다고 이미 말하고 있습니다. 또한 문서에 따르면 고유 한 제약 조건을 테이블에 추가하는 데 선호되는 방법은 ADD CONSTRAINT 고유 인덱스입니다.

고유 제한 조건을 테이블에 추가하는 선호되는 방법은 ALTER TABLE … ADD CONSTRAINT입니다. 인덱스를 사용하여 고유 한 제약 조건을 적용하는 것은 직접 액세스해서는 안되는 구현 세부 사항으로 간주 될 수 있습니다. 그러나 고유 한 열에 대해 수동으로 인덱스를 만들 필요가 없다는 점에 유의해야합니다. 이렇게하면 자동으로 생성 된 인덱스 만 복제됩니다.

Exclusion Constraints를 사용하여 구현하는 방법이 있습니다 (이 솔루션에 대해 @dukelion에게 감사드립니다)

귀하의 경우에는 다음과 같이 보일 것입니다.

ALTER TABLE stop ADD CONSTRAINT myc EXCLUDE (col_a WITH =) WHERE (col_b IS null);


답변