使用novalidate选项无法验证

时间:2011-11-02 13:34:34

标签: sql oracle plsql

嗨,我正在插入一些约会做我的桌子。由于某些原因,我不得不禁用我的约束。约束与索引相关联。我用过这行代码:

ALTER TABLE my_table DISABLE CONSTRAINT "my_constraint" drop index

my_constraint处于禁用状态。 不,我想启用此约束,但在调用此行后:

ALTER TABLE my_table ENABLE NOVALIDATE CONSTRAINT "my_constraint";\

我发现了一个错误:

  

ORA-02299:无法验证(USER.my_constraint) - - 找到重复的密钥

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

当您将行插入表中时违反了约束,看起来它是基于错误消息“找到重复键”的唯一约束

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

SELECT columna,columnb COUNT() 来自mytable 有计数()> 1

在表中的所有行都符合约束规则之前,您将无法启用唯一约束。