【发布时间】:2017-08-16 15:09:29
【问题描述】:
根据 oracle 文档,null 不能等于或不等于任何值或另一个 null
这在任何列的唯一性约束的情况下都很明显。但是,如果在多个列上存在唯一性约束,则行为会有所不同。例如:
CREATE TABLE table1 (
col1 NUMBER(2),
col2 NUMBER(2),
CONSTRAINT uniq_col1_col2 UNIQUE (col1, col2)
);
INSERT INTO table1 VALUES (1, NULL);
INSERT INTO table1 VALUES (1, NULL);
# ORA-00001: unique constraint (XYZ.UNIQ_COL1_COL2) violated
为什么会这样?以及如何指定忽略空值的约束?
编辑
更具体地说,如果行 (null), (null) 是唯一的,为什么 (1,null), (1,null) 不是唯一的?这背后的原理是什么?
【问题讨论】:
-
所以如果它忽略空值 1=1 并且它会违反约束对吗? (它已经忽略了空值)等于和不等于参考
=和<>.is not null或is null是空安全操作,可以与空值进行比较。所以 null 被比较为 col2 的 null 因此它们相等所以 1 = 1 因为所有数据都匹配(重复) -
您真正想要发生什么?这两个插入都是允许的,但是两个具有相同
col1和相同非空col2的插入不会?您将如何使用col1 = 1区分这两行?
标签: oracle