在oracle中,我想将这个唯一约束添加到一个表中,其中有一些记录收缩了这个唯一约束。我在语句末尾添加了ENABLE NOVALIDATE,但是出现了一个错误:
ORA-02158: invalid CREATE INDEX option
是否有任何方法可以添加这个唯一的索引而不验证表中的先前记录?
create unique index UK_SAME_THREAD ON T_THREADPARTICIPANT
(case when C_OPPOSITE_USER_ID is not null then C_OPPOSITE_USER_ID else null end,
case when C_OPPOSITE_USER_ID is not null then F_PARTICIPANT else null end,
case when C_OPPOSITE_USER_ID is not null then C_CONTACT_TYPE else null end)
ENABLE NOVALIDATE;
解决方法是a)创建索引(非唯一),b)创建不验证现有值的唯一约束。
包含重复ID值的表:
SQL> select * From test;
ID
----------
1
1
2
这是你试图做的:
SQL> create unique index i1 on test (id) enable novalidate;
create unique index i1 on test (id) enable novalidate
*
ERROR at line 1:
ORA-02158: invalid CREATE INDEX option
让我们只alter table
并添加唯一约束(这也不起作用):
SQL> alter table test add constraint uk_id unique (id) enable novalidate;
alter table test add constraint uk_id unique (id) enable novalidate
*
ERROR at line 1:
ORA-02299: cannot validate (SCOTT.UK_ID) - duplicate keys found
创建索引第一次…SQL> create index i1_test_id on test (id);
Index created.
…and修改表下一个:
SQL> alter table test add constraint uk_id unique (id) enable novalidate;
Table altered.
SQL>
它工作吗?
SQL> insert into test (id) values (2);
insert into test (id) values (2)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.UK_ID) violated
SQL> insert into test (id) values (3);
1 row created.
SQL>
我想是的。