根據null的定義,null表示的是未知,因此兩個null比較的結果既不相等,也不不等,結果仍然是未知。根據這個定義,多個null值的存在應該不違反唯一約束。
create table testaa (id number)
select * from testaa;
alter table testaa add unique (id);
insert into testaa values (null);
單個值null可以隨意插入進去,不報錯。
但是當唯一約束為復合字段時,則情況發生了變化。根據oracle文件的描述,對於復合欄位的唯一約束,不為空字段的值是不能重複的。也就是說,如果兩個字段構成了乙個唯一約束,其中乙個欄位為空,那麼另乙個欄位的值不能出現重複。
create table test1(id number,
id2 number);
alter table test1 add unique(id, id2);
insert into test1 values (1,1);
insert into test1values (null,null);
如果插入兩次如下的記錄,會報錯,違反唯一性。
insert into test1 values(1,null);
全部為null的情況,仍然和單字段唯一約束一樣,不會造成重複,但是對於部分為null的情況,就如上面例子所示,只要其中不為null的部分發生了重複,oracle就認為約束發生了重複。
原因如下:
由於oracle的唯一約束是依賴索引實現的,而oracle的btree索引又是不儲存null值的,所以鍵值全部為null的記錄不會記錄在索引中,因此也就不會違反唯一約束了,而對於部分為null的記錄,索引是要記錄數值的,因此一旦鍵值中非null部分發生了衝突,oracle就認為違反了的唯一約束。
oracle違反唯一約束
報錯資訊 nested exception is org.hibernate.exception.constraintviolationexception could not execute statement 背景 修改原有的邏輯,取消掉某個欄位的唯一約束。框架 spring data jpa 1...
Oracle 資料庫唯一約束中的NULL的處理
根據null的定義,null表示的是未知,因此兩個null比較的結果既不相等,也不不等,結果仍然是未知。根據這個定義,多個null值的存在應該不違反唯一約束。實際上oracle也是如此實現的 sql create table t id number 表已建立。sql alter table t ad...
ORACLE中建立 刪除唯一約束
建立索引 alter table auth organization tb add constraint unic u erpcode unique u erpcode auth organization tb 表名 unic u erpcode 自定義的唯一約束名稱 u erpcode 設定成唯一...