这个错误有什么问题?
检查约束检查列两次
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