2014-09-24 73 views
0

我試圖創建具有兩個特定列的表。在其中一個(送貨員)中有一些可能的價值。其次,也有幾個可能的價值。只有當拯救了值「A」在第二列的值是必需的,否則它可以(也應該是實際上是一個NULL)CREATE TABLE如果其他列有值,則創建具有特定值的列

這是我atempt

CREATE TABLE dict_shipping_types ( 
    id bigserial NOT NULL, 
    deliverer varchar(50) NOT NULL, 
    gage varchar(1) 
) 
; 
ALTER TABLE dict_shipping_types 
    ADD CONSTRAINT CHK_dict_shipping_types_deliverer CHECK (deliverer IN ('CompanyA','CompanyB','CompanyC')) 
    ; 
ALTER TABLE dict_shipping_types 
    ADD CONSTRAINT CHK_dict_shipping_types_gage_not_null 
     CHECK (
      (DELIVERER='CompanyA' AND GAGE IN ('A','B','C') AND GAGE != NULL) OR 
      (DELIVERER!='CompanyA' AND GAGE=NULL) 
     ) 
; 
ALTER TABLE dict_shipping_types ADD CONSTRAINT PK_dict_shipping_types 
    PRIMARY KEY (id) 
; 

測試查詢

INSERT INTO dict_shipping_types(deliverer) VALUES('CompanyA') 

INSERT INTO dict_shipping_types(deliverer,GAGE) VALUES('CompanyB','A') 

INSERT INTO dict_shipping_types(deliverer,GAGE) VALUES('CompanyA','D') 

他們都應該失敗,但只有第三個失敗。如何檢查我可以允許NULLNOT NULL值?

+0

所以,如果拯救被'A',量具應'A',否則,蓋奇應該是'NULL'?這真的必須存儲嗎?當然,你總是可以推斷Gage *會基於送貨員的價值? – 2014-09-24 10:10:53

+0

我修改了更具體的示例。以前有錯誤。如果送貨員是'A',那麼量具可以具有價值形式(A,B,C),否則它必須是空的 – 2014-09-24 10:14:31

回答

2

您可以修復它的NOT NULL/IS NOT NULL代替!=NULL/=NULL

CREATE TABLE dict_shipping_types ( 
    id bigserial NOT NULL, 
    deliverer varchar(50) NOT NULL, 
    gage varchar(1) 
) 
; 

ALTER TABLE dict_shipping_types 
    ADD CONSTRAINT CHK_dict_shipping_types_deliverer CHECK (deliverer IN ('CompanyA','CompanyB','CompanyC')) 
    ; 

ALTER TABLE dict_shipping_types 
    ADD CONSTRAINT CHK_dict_shipping_types_gage_not_null 
     CHECK (
      (DELIVERER='CompanyA' AND GAGE IN ('A','B','C') AND GAGE is not NULL) or 
(DELIVERER!='CompanyA' AND GAGE is NULL) 
); 

ALTER TABLE dict_shipping_types ADD CONSTRAINT PK_dict_shipping_types 
    PRIMARY KEY (id) 
; 
+0

這是正確的,我很尷尬,我沒有檢查,即使我想過它,但相信自己'NOT NULL'等於'!='。謝謝 – 2014-09-24 11:13:30

相關問題