【问题标题】:check constraint check the column twice检查约束 检查列两次
【发布时间】:2013-06-25 11:29:09
【问题描述】:

这个错误有什么问题?

alter table INFO 添加约束 chk_app 检查 (当应用程序为空时应用程序='A');

如果是因为 app = 'A' 我调用了两次,那么如何有一个检查约束来检查 app 是否为空,那么它应该有值 A

【问题讨论】:

  • 一个检查约束 checks 东西,你需要一个比较运算符(CASE 语句也需要一个 END)。如果你只是想确保如果 app 为 null 那么它应该是 A 那么你应该使用 wolφi 的答案。

标签: oracle constraints


【解决方案1】:

如果您想在插入带有 NULL 值的行时将列应用程序设置为“A”,我会使用 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); 

【讨论】:

【解决方案2】:

这是因为检查约束只检查值,不能改变它。

您可以像这样简单地将默认值添加到应用列或在插入或更新触发器之前写入

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 的观点。但在用户直接存储空值的情况下没有帮助,例如 INSERT INTO info(app) VALUES (NULL)
  • Petr 是对的 - 触发器是 (imo) 唯一有效的解决方案,看一个例子,DEFAULT 约束解决方案有什么问题:sqlfiddle.com/#!4/78aaa/1
  • @Ben:是的,声明 NOT NULL 就是胜利——简单又好。这可能是您第一条评论的内容 - 不要抱怨没有其他选择:)
猜你喜欢
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多