2011-11-02 56 views
2

您好我插入一些日期做我的表。由于某些原因,我必须禁用我的约束。约束与索引相关联。一,已经使用这行代码:无法验证,与NOVALIDATE选项

ALTER TABLE my_table DISABLE CONSTRAINT "my_constraint" drop index 

而且my_constraint处于禁用状态。 不,我倒要启用此约束,但调用该行后:

ALTER TABLE my_table ENABLE NOVALIDATE CONSTRAINT "my_constraint";\ 

我recive一个错误:

ORA-02299: cannot validate (USER.my_constraint) - - duplicate keys found

回答

6

你不能有一个唯一索引非唯一值。但是你可以有由一个非唯一索引强制唯一约束非唯一值。即使你最初创建一个非唯一索引,drop indexenable语法会尝试除非您提供的using index节的详细信息重新创建唯一索引。

例如:

SQL> create table my_table(my_column number, 
    2  constraint my_constraint unique (my_column)); 

Table created. 

SQL> alter table my_table disable constraint my_constraint drop index; 

Table altered. 

SQL> insert into my_table select 1 from dual union all select 1 from dual; 

2 rows created. 

SQL> alter table my_table enable novalidate constraint my_constraint; 
alter table my_table enable novalidate constraint my_constraint 
* 
ERROR at line 1: 
ORA-02299: cannot validate (USER.MY_CONSTRAINT) - duplicate keys found 


SQL> alter table my_table enable novalidate constraint my_constraint 
    2  using index (create index my_index on my_table(my_column)); 

Table altered. 

SQL> --The constraint is enforced, even though other rows violate it. 
SQL> insert into my_table values(1); 
insert into my_table values(1) 
* 
ERROR at line 1: 
ORA-00001: unique constraint (USER.MY_CONSTRAINT) violated 
+0

非唯一索引具有唯一约束,很好的解决方案! – Ollie

0

当你插入的行到您的表,你违反了约束,长相喜欢它是基于错误消息“找到重复键”的唯一约束

检查约束所基于的列,然后执行类似以下的快速查询以查看是否有任何重复的行(columna和columnb是列在你的唯一约束)

SELECT columna,columnb COUNT() FROM MYTABLE HAVING COUNT()> 1

您将无法启用独特的约束,直到表中的所有行符合约束的规则。

+0

如果我倒是想有重复? – matyyyy

+1

那么它是不是独一无二的,你的指数应该是一个非唯一索引。 –