更改表启用 novalidate 约束

0 oracle plsqldeveloper

我正在尝试UNIQUE KEY通过设置添加具有重复记录的先前存在的表ENABLE NOVALIDATE

但我越来越 ORA-02299: cannot validate (my_owner.my_key_UK ) - duplicate keys found

ALTER TABLE my_owner.my_table
ADD CONSTRAINT my_key_UK UNIQUE (ID1,ID2)
ENABLE NOVALIDATE;
Run Code Online (Sandbox Code Playgroud)

APC*_*APC 6

唯一约束使用索引来强制执行 noduplicates 规则。默认情况下,它将创建一个唯一索引(有意义吗?)。正是这个索引创建正在抛出ORA-02299

但是,如果这是受约束列上的现有索引,则约束将使用该索引。好消息是,索引不需要是唯一的约束来使用它。

所以你需要做的是先建立一个非唯一索引:

create index whatever_idx on my_table (ID1,ID2);
Run Code Online (Sandbox Code Playgroud)

然后你将能够创建你的约束:

ALTER TABLE my_owner.my_table
ADD CONSTRAINT my_key_UK UNIQUE (ID1,ID2)
ENABLE NOVALIDATE;
Run Code Online (Sandbox Code Playgroud)

您可以通过查询数据字典来检查这一点:

select uc.constraint_name
       , uc.constraint_type
       , uc.index_name
       , ui.uniqueness as idx_uniqueness
from user_constraints uc
     join user_indexes ui
          on ui.index_name = uc.index_name
where uc.table_name = 'MY_TABLE'
Run Code Online (Sandbox Code Playgroud)