更改表启用novalidate约束

时间:2017-03-20 11:22:08

标签: 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;

2 个答案:

答案 0 :(得分:2)

唯一约束使用索引来强制执行noduplicates规则。默认情况下,它会创建一个唯一的索引(对吗?)。正是这个索引创建了ORA-02299

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

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

create index whatever_idx on my_table (ID1,ID2);

然后您就可以创建约束:

ALTER TABLE my_owner.my_table
ADD CONSTRAINT my_key_UK UNIQUE (ID1,ID2)
ENABLE NOVALIDATE;

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

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'

答案 1 :(得分:0)

Oracle使用索引确保唯一值。如果您创建唯一约束,则db automatic会创建唯一索引。解决方法是添加DEFERRABLE选项。在这种情况下,oracle创建正常索引。检查示例。

create table table_abc (a number,b number);

insert into table_abc values(1,1);
insert into table_abc values(1,2);

ALTER TABLE table_abc ADD CONSTRAINT my_key_a UNIQUE (a) DEFERRABLE enable novalidate; -- no error but in table nonunique values
ALTER TABLE table_abc ADD CONSTRAINT my_key_b UNIQUE (b) ENABLE NOVALIDATE; --no error 

select * from user_indexes where table_name ='TABLE_ABC';