我正在尝试通过设置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;
答案 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';