根據NULL的定義,NULL表示的是未知,因此兩個NULL比較的結果既不相等,也不不等,結果仍然是未知。根據這個定義,多個NULL值的存在應該不違反唯一約束。
實際上Oracle也是如此實現的:
SQL> CREATE TABLE T (ID NUMBER);
表已創建。
SQL> ALTER TABLE T ADD UNIQUE (ID);
表已更改。
SQL> INSERT INTO T VALUES (1);
已創建 1 行。
SQL> INSERT INTO T VALUES (1);
INSERT INTO T VALUES (1)
*第 1 行出現錯誤:
ORA-00001: 違反唯一約束條件 (YANGTK.SYS_C007300)
SQL> INSERT INTO T VALUES (NULL);
已創建 1 行。
SQL> INSERT INTO T VALUES (NULL);
已創建 1 行。
SQL> INSERT INTO T VALUES (NULL);
已創建 1 行。
但是當唯一約束為復合字段時,則情況發生了變化。根據Oracle文檔的描述,對于復合字段的唯一約束,不為空字段的值是不能重復的。也就是說,如果兩個字段構成了一個唯一約束,其中一個字段為空,那么另一個字段的值不能出現重復。
SQL> DROP TABLE T PURGE;
表已刪除。
SQL> CREATE TABLE T (ID NUMBER, ID2 NUMBER);
表已創建。
SQL> ALTER TABLE T ADD UNIQUE (ID, ID2);
表已更改。
原文轉自:http://www.anti-gravitydesign.com