據Oracle的文檔,一個空不能相等或不相等的任何值或另一個空唯一性約束導致與空值
這在任何列中的唯一性約束的情況下是明顯的問題。但是,如果多列上的唯一性約束,行爲是不同的。例如:
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,它會違反約束嗎? (它已經忽略了空值)等於和不等於引用'='和'<>。「不爲空」或「爲空」是空安全操作並且可以與空值進行比較。所以是空比較爲col2爲null,因此它們是相等的,所以是1 = 1,因爲所有數據匹配(重複) – xQbert
你真的想發生什麼?這兩個插入將被允許,但兩個具有相同'col1'和相同非空'col2'的插入不會?你如何區分'col1 = 1'這兩行? –