2012-03-29 93 views
4

我試圖在數據庫中的幾列創建一個檢查,強制它們爲空,除非另一列的值爲是。我試過類似根據另一列的值在多列上創建約束

ALTER TABLE TABLE1 
ALTER Column1 
CHECK (Column2 = 'y') 

但是,這似乎並沒有工作。有沒有辦法像這樣做,還是有更好的解決這個問題的方法?任何正確方向的幫助都會很大。

回答

5

如果你想要求col1爲空,除非col2是「Y」,你可以寫你的CHECK約束爲:

col2 = 'y' OR col1 IS NULL 

如果您還希望要求col1必須有一個值時col2是「Y」 ,你可以寫約束爲:

(col2 = 'y' AND col1 IS NOT NULL) OR (col2 != 'y' AND col1 IS NULL) 

你應該把它寫成表約束,順便說一句。我不認爲列約束被允許引用其他列。 (但是列約束只是寫表約束的另一種方式,所以你不會因爲寫表約束而損失任何東西)

0

這麼多的選擇是有...

但檢查通常用來檢查行..如果條件不那麼滿足該行將以數據庫忽略...

你可以試試觸發...

CREATE OR REPLACE TRIGGER trg_table1_col2 
    before INSERT ON table1 
    DECLARE 
    duplicate_info EXCEPTION; 
    BEGIN 
    if :new.coloumn2 <>'y' 
then :new.column1 := null; 
end if;  
    END trg_table1_col2; 

可以有一些語法錯誤。請檢查並糾正它.. 我沒有數據庫,在我的機器截至目前..

+0

這個觸發器是有風險的,因爲它會默默地忽略列中的'column1'值INSERT語句,而不報告該行不可接受的錯誤。這可能會導致數據丟失。 – Wyzard 2012-03-29 04:19:33

+1

如果你的column2不是'y',那麼你想要與column1相同的null,不是嗎? 如果是這樣,然後觸發選項是沒有風險的,因爲你已經評論.. – 2012-03-29 05:08:31

+0

你也可以顯示異常,如果你想讓用戶注意關於這種情況下的hs故障...但看到你問**檢查我的數據庫中有很少的列強制它們爲空,除非另一列的值爲yes **然後數據庫(觸發器會這樣做)將強制在此列中存儲null。 – 2012-03-29 05:12:22