2013-06-05 4 views
1

PostgreSQL의 여러 null 가능 컬럼에서 고유 제한 조건을 적용하는 가장 좋은 방법을 찾으려고합니다.PostgreSQL 온 전성 체크에서 다중 고유 부분 인덱스

CREATE TABLE test_table 
(
    id serial NOT NULL, 
    col_a character varying(255), 
    col_b character varying(255), 
    col_c date, 
    col_d integer, 
    CONSTRAINT test_table_pkey PRIMARY KEY (id), 
    CONSTRAINT test_table_col_a_col_b_col_c_key UNIQUE (col_a , col_b , col_c) 
); 

col_a, col_bcol_c의 조합은 고유해야하지만 그들은 모두도 널 (NULL) :

다음 표를 고려.

unique(col_a, col_b) where col_c is null 
unique(col_a, col_c) where col_b is null 
unique(col_b, col_c) where col_a is null 
unique(col_a) where col_b is null and col_c is null 
unique(col_b) where col_a is null and col_c is null 
unique(col_c) where col_a is null and col_b is null 

이 할 수있는 '제정신'일 수 있습니다 : 고유 제한 조건을 적용 할

나의 현재 솔루션은 6 개 부분 인덱스 (아래 seudo 코드)를 만드는 것입니다? 중요한 성능 문제가 있습니까?

답변

1

필자가 아는 한 (create table, create unique index 등을 사용하여) 선언으로이를 수행하는 유일한 방법입니다. 물론 각 색인을 업데이트해야합니다. 테이블이 특정 한도를 초과하여 성장하는 경우 문제가 될 수 있습니다.

이 모든 상황에 적용되지 않을 수도 있지만, 너무 많은 인덱스에 대한 필요성을 피하기 위해, 나는 NOT NULL로 열을 선언하고 난 (예를 들어, 그것의 논리적 빈 값을 넣어 : " ","없음 "또는"1900-01-01 "). 물론 나중에 임시 쿼리 나 응용 프로그램에서 다시 null으로 디코딩해야 할 수도 있습니다.