2013-06-25 172 views
0

這個錯誤有什麼問題?
檢查約束檢查列兩次

ALTER TABLE INFO添加約束chk_app檢查 (CASE WHEN應用爲NULL,則應用程式= 'A');

如果因爲應用=「A」我叫它然後兩次如何有一個檢查約束來檢查,如果應用程序爲null,則它應該有值A

+1

檢查約束_checks_的東西,你需要一個比較操作符(也一個CASE語句需要一個END)。如果你只是想確保如果應用程序爲null,那麼它應該是A,那麼你應該使用wolφi的答案。 – Ben

回答

3

寫如果要設置列應用「A」每當行插入值爲NULL ,我會使用一個DEFAULT構建體:

ALTER TABLE info MODIFY (app VARCHAR2(xxx) DEFAULT 'A'); 

如果INSERT過程中未指定值,「A」被插入到app柱。當然,用戶可以通過顯式插入NULL值來覆蓋此行爲。這可以通過NOT NULL約束防止:

ALTER TABLE info MODIFY (app VARCHAR2(xxx) DEFAULT 'A' NOT NULL); 

從Oracle版本12C上,您可以指定所需的行爲更清楚:

ALTER TABLE info MODIFY (app VARCHAR2(xxx) DEFAULT ON NULL 'A' NOT NULL); 
+0

這不是最好的答案,請參閱Petr的回答,我舉了一個例子:http://www.sqlfiddle.com/#!4/78aaa/1 –

3

這是bacause檢查約束只檢查價值,它不能改變它。

您可以簡單地添加默認值到App列或之前插入或更新觸發器這樣

create or replace trigger info_briu 
before insert or update of info 
for each row 
begin 
    if :new.app is null then 
    :new.app := 'A'; 
    end if; 
end; 
+1

對於這種情況,觸發器是巨大的矯枉過正。 – Ben

+0

也許,但如果插入爲該列提供空值,那麼將不會應用默認值。當然插入不會那樣做。 –

+0

是的,我在大多數情況下都贊同Ben。但在用戶直接存儲空值的情況下不起作用,如INSERT INTO info(app)VALUES(NULL) –