2009-02-23 5 views
5

열이 null이 아닌 경우에만 제약 조건을 적용하는 솔루션이 필요합니다. 설명서에서이 작업을 수행 할 방법을 찾지 못하는 것 같습니다.Postgresql에서 열이 null이 아닌 경우에만 제약 조건을 적용 할 수 있습니까?

create table mytable(
    table_identifier_a INTEGER, 
    table_identifier_b INTEGER, 
    table_value1,...) 

데이터의 성질에 따라 테이블을 만들 때 식별자 b와 값을 갖습니다. 추가 데이터를 받으면 식별자 a를 채울 수 있습니다. 이 시점에서 나는 identifier_a가 존재하는 경우에만 unique key of (identifier_a, value1)을 보장하고자합니다.

희망적으로 말이 되겠습니까? 어떤 아이디어가 있습니까?

답변

6

음. 고유 제한 조건은 다중 NULL 값을 방지하지 않습니다. 우리가 그것으로 muliple 널 (NULL)을 삽입 할 수 있습니다

CREATE TABLE mytable (
    table_identifier_a INTEGER NULL, 
    table_identifier_b INTEGER NOT NULL, 
    table_value1   INTEGER NOT NULL, 

    UNIQUE(table_identifier_a, table_identifier_b) 
); 

주, 심지어 identifier_b 경기 :

test=# INSERT INTO mytable values(NULL, 1, 2); 
INSERT 0 1 
test=# INSERT INTO mytable values(NULL, 1, 2); 
INSERT 0 1 
test=# select * from mytable; 
table_identifier_a | table_identifier_b | table_value1 
--------------------+--------------------+-------------- 
        |     1 |   2 
        |     1 |   2 
(2 rows) 

그러나 우리는 만들 수 없습니다 중복 (A, B) 쌍 :

test=# update mytable set table_identifier_a = 3; 
ERROR: duplicate key value violates unique constraint "mytable_table_identifier_a_key" 

물론 테이블에 기본 키가 없습니다. 에 데이터 모델 문제가있을 수 있습니다. 그러나 그 문제를 해결하기 위해 충분한 세부 정보를 제공하지 않았습니다.

+0

데이터 모델 문제는 제 고객이 아닙니다. 감사. –

0

제약 조건 대신 트리거를 사용하여 처리 할 수 ​​있습니다.

0

내가 너라면 필자는 테이블을 두 개의 테이블로 나눠서 필요에 따라 결합하는보기를 만들 수 있습니다.

1

가 하나의 트랜잭션 내에서 전체 작업을 완료하는 데 가능한 경우,이 POSTGRES 시간을 변경할 수는 제한 조건이 커밋에서 평가,이 경우 제약 조건, 즉 :

START; 
SET CONSTRAINTS <...> DEFERRED; 
<SOME INSERT/UPDATE/DELETE> 
COMMIT; 

을 평가합니다. 참조 : Postgres 7.4 Doc - Set constraints 또는 Postgres 8.3 Doc

1

사실, 아마도 이것을 두 개의 테이블로 나눌 수 있습니다. 두 가지 다른 종류의 것을 모델링하고 있습니다. 첫 번째 버전은 부분 버전 인 초기 버전이고 두 번째 버전은 전체 버전입니다. 첫 번째 종류의 것을 두 번째 테이블로 가져 오는 데 필요한 정보가 있으면 한 테이블에서 다른 테이블로 행을 이동하십시오.

관련 문제