하나의 열에 특정 값이있는 경우에만 적용되는 사용자 지정 고유 열 제약 조건


19

다음과 같이 사용자 지정 고유 열 제약 조건을 가질 수 있습니까? 나는 두 COLS이 있다고 가정, subset그리고 type, 두 문자열을 (데이터 유형은 아마 중요하지 않습니다하지만).

type"true"인 경우 typesubset고유 한 조합을 원합니다 . 그렇지 않으면 제약이 없습니다. 데비안에서 PostgreSQL 8.4를 사용하고 있습니다.


답변:


31

즉, subsetif 고유해야 type = 'true'합니다. 부분 고유 인덱스는 그렇게 할 것입니다 :

CREATE UNIQUE INDEX tbl_some_name_idx ON tbl (subset) WHERE type = 'true';

이렇게하면 NULL고유 한 조합을 만들 수도 있습니다 .이 관련 답변에 자세히 설명 된 것처럼
PostgreSQL 다중 열 고유 제약 조건 및 NULL 값


감사합니다 Erwin. 설명서를 볼 때이 옵션이 보이지 않았습니다. 보다 직접적인 링크는 postgresql.org/docs/current/interactive/indexes-partial.html 입니다. 예 11-3을 참조하십시오.
Faheem Mitha

@FaheemMitha : 당신이 할 필요가 있기 때문에 나는 한 단계 더 높은 링크 결합 부분 인덱스를고유 인덱스 .
Erwin Brandstetter

1
@Erwin 해당 페이지 (부분 인덱스에 대한)에는 부분 고유 인덱스가 포함 된 예가 있습니다.
ypercubeᵀᴹ

@ ypercube : 아, 맞아. 더 나은 연결입니다. 마지막 장을 가리 키도록 답변을 변경했습니다.
Erwin Brandstetter

6

이것은 위의 Erwin의 답변을 보완하지만 PostgreSQL은 여러 유형의 인덱스를 지원합니다. 이들은 일반적으로 상호 배타적이지 않습니다. 다음과 같이 생각할 수 있습니다.

  • 인덱스 방법 (btree, GiST, GIN 등). 필요한 경우 하나를 선택하십시오 (기본값은 btree).
  • 부분 또는 전체. where 절을 부분적으로 사용하는 경우
  • 직접 또는 기능. 함수의 출력을 색인 할 수 있습니다.
  • 고유하거나 고유하지 않은

이들은 모두 다양한 방식으로 결합 될 수 있습니다. 여기서 수행하는 작업은 고유 한 기능과 부분 기능을 사용하는 것이므로 부분적으로 고유 한 인덱스를 제공합니다 (발견 할 때 매우 유용함).

그러나 type이 true 인 서브 세트 필드에 대소 문자를 구분하지 않는 색인 을 원한다고 가정하십시오 . 그런 다음 기능 정의를 추가합니다.

CREATE INDEX my_index_name_idx_u ON tbl (lower(subset)) WHERE type;

이렇게하면 type이 true 인 하위 집합 속성에서 호출 된 lower () 함수 의 출력 에 고유 인덱스가 생성 됩니다.


따라서 Erwin의 답변에 대한 색인은 직접적이지만 귀하의 예에 나오는 기능은 정확합니까?
Faheem Mitha

@FaheemMitha : 맞습니다.
Erwin Brandstetter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.