我尝试使用以下方法在数据库中删除唯一约束:
ALTER TABLE MyDbAdmin.myTable
DROP UNIQUE (myCol);
控制台表示删除有效,但是当我尝试插入具有重复myCol
的记录时,返回了ORA-00001: unique constraint
错误。
我尝试查看表的约束页面,唯一约束确实消失了。另外,如果我运行相同的SQL再次删除约束,它将返回ORA-02442: Cannot drop nonexistent unique key
。
以上查询是使用帐户myDbUser
进行的,这是否是导致上述异常行为的原因?
答案 0 :(得分:3)
也许您的唯一索引是在创建约束之前创建的:
create table t(col1 number);
create unique index t_idx on t(col1);
alter table t add constraint t_unique unique(col1);
insert into t values(1);
--> 1 row created
insert into t values(1);
--> ORA-00001: unique constraint (TEST.T_UNIQUE) violated
alter table t drop unique (col1);
insert into t values(1);
--> ORA-00001: unique constraint (TEST.T_IDX) violated
尽管在user_constraints中没有出现唯一索引T_IDX,但它在错误消息中显示。
如果在内部创建索引作为“更改表...添加约束”的一部分,则可以在删除约束后插入重复项,因为支持约束的索引会与约束一起被删除。因此,如果没有“创建唯一索引”,代码将按预期工作:
create table t(col1 number);
-- create unique index t_idx on t(col1);
alter table t add constraint t_unique unique(col1);
insert into t values(1);
--> 1 row created
insert into t values(1);
--> ORA-00001: unique constraint (TEST.T_UNIQUE) violated
alter table t drop unique (col1);
insert into t values(1);
--> 1 row created
答案 1 :(得分:1)
如果粘贴整个错误行可能会很有用。为什么?我们会看到唯一的约束名称,这可能是解决问题的关键。
这就是我的想法:这里有一个包含myCol列的复合唯一索引。
SQL> create table test (mycol number, id number);
Table created.
SQL> alter table test add constraint ukt unique (mycol);
Table altered.
SQL> create unique index i1t on test (mycol, id);
Index created.
SQL>
测试:
SQL> -- this is OK
SQL> insert into test values (1, 1);
1 row created.
SQL> -- but, this will fail
SQL> insert into test values (1, 1);
insert into test values (1, 1)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.UKT) violated
SQL>
违反了UKT约束,所以-让我们放下它,然后重试:
SQL> alter table test drop unique (mycol);
Table altered.
SQL> insert into test values (1, 1);
insert into test values (1, 1)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.I1T) violated
SQL>
看看现在违反了哪个约束? I1T。
一旦确定违反了哪个约束,请尝试使用以下任一方法查找更多信息:
SQL> select column_name from user_cons_columns where constraint_name = 'I1T';
no rows selected
SQL> select column_name from user_ind_columns where index_name = 'I1T';
COLUMN_NAME
-----------------------------------------------------------------------------
MYCOL
ID
SQL>