novalidate,错误ora-02299

Mou*_*diz 2 oracle unique-constraint

有人可以帮我吗?

id | Name
--------
1  | aaa
2  | bbb
3  | aaa

>alter table arc add CONSTRAINT uk_arc UNIQUE (NAME) novalidate
 error :ora-02299: cannot validate( .uk_arc ) - duplicate keys found
Run Code Online (Sandbox Code Playgroud)

我使用novalidate忽略旧的重复并开始重新验证.

Yas*_*aev 9

如果我正确地告诉您,您希望Oracle忽略旧的重复值,并仅在满足约束时允许新值.返回错误是因为当您添加UNIQUE约束时,Oracle会在列上创建唯一索引以检查值,但是您的表已经具有重复值,因此它会失败.我首先创建非唯一索引,然后添加约束,以便它使用您现有的非唯一索引,而不是自动创建将失败的唯一索引:

create index arc_ix on arc (name);

alter table arc add constraint arc_uq unique (name) enable novalidate;
Run Code Online (Sandbox Code Playgroud)

  • 为了保证`UNIQUE`约束所需的唯一性,Oracle需要索引,默认情况下,如果添加`UNIQUE`约束,它会创建唯一索引.单独的唯一索引可以保证唯一性,这种"UNIQUE"约束是多余的.因此,在这种情况下,`UNIQUE`约束更像是一种说明存在某种约束的声明方式.另一方面,非唯一索引允许重复(因此名称),并且可以用作"UNIQUE"约束作为确定是否存在重复值的手段.在这种情况下,约束不是声明性的. (2认同)