Почему когда удаляю уникальное ограничение, то оно продолжает работать?

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, который тоже надо было удалить

→ Ссылка
Автор решения: 0xdb

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.
→ Ссылка