Почему когда удаляю уникальное ограничение, то оно продолжает работать?
USERDB> ALTER TABLE mw_thirdparty_service DROP CONSTRAINT mt_service_external_unq
[2021-07-05 11:34:33] completed in 112 ms
USERDB> INSERT INTO mw_thirdparty_service(
mw_thirdparty_service_id,
external_id,
gos_no,
service_name,
supplier_id,
mt_ch_limit,
accuracy_class,
wo_category_id)
VALUES(
mw_thirdparty_service_seq.nextval,
'44008042008733',
null,
'44008042008733',
669,
null,
null,
2)
[2021-07-05 11:34:42] [23000][1] ORA-00001: unique constraint (USERDB.MT_SERVICE_EXTERNAL_UNQ) violated
[2021-07-05 11:34:42] Position: 0
USERDB> select * from ALL_CONSTRAINTS where CONSTRAINT_NAME = 'MT_SERVICE_EXTERNAL_UNQ'
[2021-07-05 11:34:48] 0 rows retrieved in 202 ms (execution: 168 ms, fetching: 34 ms)
Пробовал явно указывать пользователя/cхему при указании таблицы, пробовал отключать ограничение, отключать и удалять, но оно всё ещё работает.
Поиск ограничений по этой таблице через - all_constraints where table_name выдаёт все ограничения, кроме нужного.
Перезагрузка БД тоже не помогла
Ответы (2 шт):
Oracle сделал unique index с тем же названием что и constraint, который тоже надо было удалить
Oracle сделал unique index с тем же названием что и constraint, который тоже надо было удалить
Не совсем так, не Oracle каким-то образом создал уникальный индекс, этот индекс уже существовал до создания ограничения, т.е. был создан явно.
При создании уникального ограничения, всегда неявно создаётся уникальный индекс с тем же именем. Этот индекс будет неявно удалён, если удалить ограничение.
Воспроизводимый пример (fiddle 1):
create table T (id int)
/
insert into t values (1)
/
1 row inserted.
alter table t add constraint uqt unique (id)
/
insert into t values (1)
/
ORA-00001: unique constraint (DB.UQT) violated
alter table t drop constraint uqt
/
insert into t values (1)
/
1 row inserted.
Если же индекс был создан явно, то при создании ограничения с тем же именем, новый индекс создан не будет, но и удалён этот индекс при удалении ограничения не будет.
Воспроизводимый пример (fiddle 2):
create table T (id int)
/
insert into t values (1)
/
1 row inserted.
create unique index uqt on t (id)
/
alter table t add constraint uqt unique (id)
/
insert into t values (1)
/
ORA-00001: unique constraint (DB.UQT) violated
alter table t drop constraint uqt
/
insert into t values (1)
/
ORA-00001: unique constraint (DB.UQT) violated
В последнем случае, можно удалить индекс одним запросом вместе с ограничением с опцией drop index (fiddle 3):
alter table t drop constraint uqt drop index
/
insert into t values (1)
/
1 row inserted.