2012-06-13 5 views
7

데이터베이스별로 하나의 주제에 대해 여러 개의 주소를 저장하는 방법을 찾고 싶습니다. 주제 당 하나의 기본 주소 만 있습니다. Postgres Postgres 두 개의 열에 대한 고유 제한 조건 : 정수 및 부울

는 짧게 이야기하면, 우리는 테이블이 있다고 가정 할 수 있습니다 : 테이블의 각 ID에 대한

CREATE TABLE test 
(
    id integer NOT NULL, 
    active boolean NOT NULL, 
    CONSTRAINT pk_id PRIMARY KEY (id) 
) 

을 최대 1 사실 활성 값이 있어야합니다.

어떻게하면됩니까?

감사합니다. @ThiefMaster으로

create unique index some_index on test (id) where active; 

차 인덱스가 제거되어야합니다 상태 :

+0

실제로 id 키가 기본 키이므로 id가 고유하므로 * 동일한 ID를 가진 두 행이 될 수 없으므로 아무 것도 할 필요가 없습니다. – ThiefMaster

+0

'id'를 기본으로 사용하지 않으려면 트리거를 작성해야합니다. http://www.postgresql.org/docs/9.1/static/sql-createtrigger.html하지만 원하는 것은 아닐 것입니다. –

답변

11

Partial index 당신이 원하는합니다.

+0

감사합니다. 내 PK가이 테이블의 주소 PK이기 때문에 괜찮습니다. 이것은 또한 작동합니다 : CREATE UNIQUE INDEX some_index ON 테스트 USING btree (활성, id) WHERE 활성; – greatkalu

+0

쿼리에서 실제로 변경 한 것은 활성 인덱스를 추가하는 것입니다. 색인 생성을위한 주제가 약간의 부풀림을 추가 한 모든 필드에 대해 항상 활성화됩니다. – kworr

+1

PK는 UNIQUE 및 NOT NULL 제약 조건의 합계입니다. – kworr

3

이 질문의 경우 이전에 설명한 것처럼 필요하지 않습니다.

그러나 FY0 은 다른 유형의 2 개 이상의 (비 PrimaryKey) 열에 제약 조건을 설정할 수 있습니다. 예를 들어 :

ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (integer_column, boolean_column); 

은 더 많은 정보 Constraints은 "고유 제약 조건"섹션의 포스트 그레스 문서를 참조하십시오. 인용하자면 :

을 고유 제한 조건이 컬럼의 그룹을 참조하는 경우, 열이 ... 쉼표로 구분하여 나열되어 있습니다

이 표시된 열에있는 값의 조합이 전체 테이블에서 고유하도록 지정

, 컬럼 중 어느 하나가 유일 할 필요는 없지만 일반적으로 고유하지는 않습니다.

참고 : A는 partial index 완전히 다른 목적이있는 테이블의 부분 집합에 구축되는 인덱스를 설정합니다.

+0

당신의 솔루션으로 그는 여러 개의 비활성 주소를 가질 수 없다고 생각합니다. – Hossein