暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 检查约束语法

ASKTOM 2020-03-03
259

问题描述

嗨,

我正在尝试在表级别创建检查contraint。我尝试了以下两种结构,在我的理解中应该具有相同的效果。

ALTER TABLE table1 ADD CONSTRAINT CHK_1
CHECK (  col1 || col2 <> col3 || col4);

ALTER TABLE table1 ADD CONSTRAINT CHK_2
CHECK (  col1 <> col3 AND col2 <> col4);
复制


第一个运行完美,运行我得到的第二个
ORA-02290: “检查约束 (% s.% s) 违反”

为什么第二个不被接受?

非常感谢。
问候,
安东尼奥

专家解答

这些甚至都不是一样的!

如果任一条件为假,则第二个将失败。添加导致误报的空处理和串联的差异,您将获得一整堆行,这些行将接受一个约束,但不接受另一个约束。

例如,将它们转换为查询,并给出不同的结果:

create table t (
  c1 int, c2 int,
  c3 int, c4 int
);

insert into t values ( 1, 2, 1, 4 );
insert into t values ( 11, 1, 1, 11 );

select * from t
where  c1 || c2 <> c3 || c4;

C1    C2    C3    C4   
    1     2         1     4 

select * from t
where  c1 <> c3 and c2 <> c4;

C1    C2    C3    C4   
   11     1     1    11 
复制

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论