删除唯一约束不起作用

时间:2018-08-10 07:15:05

标签: sql oracle constraints unique-constraint

我尝试使用以下方法在数据库中删除唯一约束:

ALTER TABLE MyDbAdmin.myTable
DROP UNIQUE (myCol);

控制台表示删除有效,但是当我尝试插入具有重复myCol的记录时,返回了ORA-00001: unique constraint错误。

我尝试查看表的约束页面,唯一约束确实消失了。另外,如果我运行相同的SQL再次删除约束,它将返回ORA-02442: Cannot drop nonexistent unique key

以上查询是使用帐户myDbUser进行的,这是否是导致上述异常行为的原因?

2 个答案:

答案 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>