2014-04-27 1 views
14

에서 NULL 값 나는 다음과 같은 테이블 (간체)있어했습니다PostgreSQL을 내 PostgreSQL 데이터베이스에서 외래 키 열

CREATE TABLE quotations (
    receipt_id bigint NOT NULL PRIMARY KEY 
); 

    CREATE TABLE order_confirmations (
    receipt_id bigint NOT NULL PRIMARY KEY 
    fk_quotation_receipt_id bigint REFERENCES quotations (receipt_id) 
); 

내 문제는 이제 다음 읽습니다 :

내가 관련 주문이 이전의 견적 (이것은 FK 필드를 사용하여 인용 된 견적에 그러한 주문을 첨부 할 수 있기 때문에 괜찮습니다.) 과 일치하는 견적이없는 주문도 있습니다. 물론 FK 필드는 NULL이 될 것입니다. 데이터베이스를 사용하면 물론입니다. 불행히도 이 외부 키 제약을 위반했기 때문에 fck_quotation_receipt_id를 INSERT 문에서 NULL로 설정하려고 시도 할 때 오류이 발생합니다.

이 테이블을 디자인 할 때 나는 여전히 NULL 값을 허용하는 PgSQL 8.2를 사용하고있었습니다. 이제는 9.1.6을 얻었습니다.

선택 사항 (또는 null 입력 가능) 외래 키 제약 조건 order_confirmations (fk_quotation_receipt_id) → 인용문 (receipt_id)입니다. 나는 공식 PgSQL 문서에서 어떤 힌트도 찾을 수 없으며, uther 사용자가 게시 한 비슷한 문제는 이미 꽤 오래되었다.

유용한 힌트를 제공해 주셔서 감사합니다.

답변

12

누락 된 쉼표를 수정 한 후 9.3에서 나를 위해 작동합니다. 나는 그것이 9.1에서 또한 작동 할 것이라고 확신한다.

create table quotations (
    receipt_id bigint not null primary key 
); 

create table order_confirmations (
    receipt_id bigint not null primary key, 
    fk_quotation_receipt_id bigint references quotations (receipt_id) 
); 

insert into order_confirmations (receipt_id, fk_quotation_receipt_id) values 
    (1, null); 
INSERT 0 1 
+0

누락 된 쉼표는 문제가되지 않는다 (나는 grrrrr을 복사 할 때 간단히 잊었다). 클라이언트 코드가 NULL 대신 0을 추가 한 것으로 밝혀졌습니다. 그리고 이것은 준비된 명령문 이었기 때문에 로그에서 볼 수 없었습니다. 그럼에도 불구하고 당신의 대답에 대해 많이 고맙습니다. – Neppomuk