Oracle唯一約束中NULL處理

2022-05-09 20:50:43 字數 1044 閱讀 7316

根據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 設定成唯一...