debugModerate
Cannot drop nonexistent constraint and cannot create it either
Viewed 0 times
cannotcreateeitherdropnonexistentconstraintand
Problem
While testing some migration scripts with a copy of production data (scripts run fine with development data) I found a curious situation. A CONSTRAINT has changed so I'm issuing DROP + ADD commands:
The DROP command worked fine but the ADD one failed. Now, I'm into a vicious circle. I cannot drop the constraint because it doesn't exist (initial drop worked as expected):
ORA-02443: Cannot drop constraint - nonexistent constraint
And I cannot create it because the name already exists:
ORA-00955: name is already used by an existing object
I type
My questions:
(Server is 10g XE, I don't have enough reputation to create the tag.)
ALTER TABLE A_DUP_CALLE
DROP CONSTRAINT A_DUP_CALLE_UK1;
ALTER TABLE A_DUP_CALLE
ADD CONSTRAINT A_DUP_CALLE_UK1 UNIQUE (
CONTROL_ID,
CALLE_AYTO_DUPL
)
ENABLE;The DROP command worked fine but the ADD one failed. Now, I'm into a vicious circle. I cannot drop the constraint because it doesn't exist (initial drop worked as expected):
ORA-02443: Cannot drop constraint - nonexistent constraint
And I cannot create it because the name already exists:
ORA-00955: name is already used by an existing object
I type
A_DUP_CALLE_UK1 into SQL Developer's Search box and... there it is! Owner, table name, tablescape... everything matches: it isn't a different object with the same name, it is my original constraint. The table appears in the constraint details but the constraint does not appear in the table's details.My questions:
- What's the explanation for this?
- How can I ensure it won't happen when I make the real upgrade in live server?
(Server is 10g XE, I don't have enough reputation to create the tag.)
Solution
At a guess I'd say Marian is right and this is caused by a unique index and constraint having the same name, eg:
Normally when you add a unique constraint, a unique index with the same name is created - but the index and constraint are not the same thing. Have a look at
create table t( k1 integer, k2 integer,
constraint u1 unique(k1,k2) using index(create unique index u1 on t(k1,k2)),
constraint u2 unique(k2,k1) using index u1);
select count(*) from user_indexes where index_name='U1';
COUNT(*)
----------------------
1
alter table t drop constraint u1;
select count(*) from user_indexes where index_name='U1';
COUNT(*)
----------------------
1Normally when you add a unique constraint, a unique index with the same name is created - but the index and constraint are not the same thing. Have a look at
all_indexes to see if there is an index called A_DUP_CALLE_UK1 and try and figure out if it is used by something else before you drop it!Code Snippets
create table t( k1 integer, k2 integer,
constraint u1 unique(k1,k2) using index(create unique index u1 on t(k1,k2)),
constraint u2 unique(k2,k1) using index u1);
select count(*) from user_indexes where index_name='U1';
COUNT(*)
----------------------
1
alter table t drop constraint u1;
select count(*) from user_indexes where index_name='U1';
COUNT(*)
----------------------
1Context
StackExchange Database Administrators Q#5332, answer score: 14
Revisions (0)
No revisions yet.