這個錯誤有什麼問題?
檢查約束檢查列兩次
ALTER TABLE INFO添加約束chk_app檢查 (CASE WHEN應用爲NULL,則應用程式= 'A');
如果因爲應用=「A」我叫它然後兩次如何有一個檢查約束來檢查,如果應用程序爲null,則它應該有值A
這個錯誤有什麼問題?
檢查約束檢查列兩次
ALTER TABLE INFO添加約束chk_app檢查 (CASE WHEN應用爲NULL,則應用程式= 'A');
如果因爲應用=「A」我叫它然後兩次如何有一個檢查約束來檢查,如果應用程序爲null,則它應該有值A
寫如果要設置列應用「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);
這不是最好的答案,請參閱Petr的回答,我舉了一個例子:http://www.sqlfiddle.com/#!4/78aaa/1 –
這是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;
對於這種情況,觸發器是巨大的矯枉過正。 – Ben
也許,但如果插入爲該列提供空值,那麼將不會應用默認值。當然插入不會那樣做。 –
是的,我在大多數情況下都贊同Ben。但在用戶直接存儲空值的情況下不起作用,如INSERT INTO info(app)VALUES(NULL) –
檢查約束_checks_的東西,你需要一個比較操作符(也一個CASE語句需要一個END)。如果你只是想確保如果應用程序爲null,那麼它應該是A,那麼你應該使用wolφi的答案。 – Ben