我試圖在數據庫中的幾列創建一個檢查,強制它們爲空,除非另一列的值爲是。我試過類似根據另一列的值在多列上創建約束
ALTER TABLE TABLE1
ALTER Column1
CHECK (Column2 = 'y')
但是,這似乎並沒有工作。有沒有辦法像這樣做,還是有更好的解決這個問題的方法?任何正確方向的幫助都會很大。
我試圖在數據庫中的幾列創建一個檢查,強制它們爲空,除非另一列的值爲是。我試過類似根據另一列的值在多列上創建約束
ALTER TABLE TABLE1
ALTER Column1
CHECK (Column2 = 'y')
但是,這似乎並沒有工作。有沒有辦法像這樣做,還是有更好的解決這個問題的方法?任何正確方向的幫助都會很大。
如果你想要求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)
你應該把它寫成表約束,順便說一句。我不認爲列約束被允許引用其他列。 (但是列約束只是寫表約束的另一種方式,所以你不會因爲寫表約束而損失任何東西)
這麼多的選擇是有...
但檢查通常用來檢查行..如果條件不那麼滿足該行將以數據庫忽略...
你可以試試觸發...
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;
可以有一些語法錯誤。請檢查並糾正它.. 我沒有數據庫,在我的機器截至目前..
這個觸發器是有風險的,因爲它會默默地忽略列中的'column1'值INSERT語句,而不報告該行不可接受的錯誤。這可能會導致數據丟失。 – Wyzard 2012-03-29 04:19:33
如果你的column2不是'y',那麼你想要與column1相同的null,不是嗎? 如果是這樣,然後觸發選項是沒有風險的,因爲你已經評論.. – 2012-03-29 05:08:31
你也可以顯示異常,如果你想讓用戶注意關於這種情況下的hs故障...但看到你問**檢查我的數據庫中有很少的列強制它們爲空,除非另一列的值爲yes **然後數據庫(觸發器會這樣做)將強制在此列中存儲null。 – 2012-03-29 05:12:22