2013-06-25 58 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) –