테이블의 일부에서만 열에 고유성을 적용하는 제약 조건을 추가하고 싶습니다.
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);