- У меня есть таблица с
Col1
иCol2
в качестве составного первичного ключаpk_composit_key
и уникального индекса, который был автоматически создан для ограничения. - Затем я изменил таблицу, добавив новый столбец
Col3
. Я снял ограничение
pk_composit_key
:ALTER TABLE имя_таблицы DROP CONSTRAINT pk_composit_key;
Теперь, когда я попытался вставить записи, я получил
ORA-00001: unique constraint pk_composit_key violated
.- Why am I getting that error?
- Когда ключ был сброшен, почему уникальный индекс не был удален автоматически?
Почему при удалении первичного ключа не удаляется его уникальный индекс?
Ответы (2)
Вы упомянули об экспорте и импорте схемы, и если это произойдет в среде, которая демонстрирует такое поведение, это объяснит, что вы видите; по крайней мере, если вы использовали устаревшую imp
, а не перекачку данных impdp
.
Исходная документация по импорту утверждает, что объекты заказа импортировано:
Объекты таблицы импортируются по мере чтения из файла дампа экспорта. Файл дампа содержит объекты в следующем порядке:
- Определения типов
- Определения таблиц
- Табличные данные
- Индексы таблиц
- Ограничения целостности, представления, процедуры и триггеры
- Растровые, функциональные и доменные индексы
Таким образом, уникальный индекс был бы импортирован, а затем было бы создано ограничение.
Когда вы отбрасываете ограничение первичного ключа:
- Если первичный ключ был создан с использованием существующего индекса, то индекс не удаляется.
- Если первичный ключ был создан с использованием индекса, созданного системой, то индекс удаляется.
Из-за порядка импорта ограничение использует существующий индекс, поэтому применяется первый маркер; и индекс сохраняется при снятии ограничения.
Чтобы удалить index, даже если он не был создан автоматически:
ALTER TABLE table_name DROP CONSTRAINT pk_composit_key DROP INDEX;
См. Также My Oracle Support note 370633.1; и 1455492.1 предполагает, что аналогичное поведение будет происходить и при импорте перекачки данных. Я не знаю, как проверить, связан ли индекс с ограничением на этом уровне; нет никакой разницы в dba_constraints
или dba_indexes
представлениях, когда вы создаете индекс вручную или автоматически. Однако включение drop index
сделает его согласованным.
Это зависит от того, как был создан уникальный индекс ... ниже приведены различные способы и поведение
1) сначала создайте уникальный индекс (в столбце, для которого должен быть определен первичный ключ), а затем добавьте ограничение первичного ключа. В этой ситуации ваш DDL для добавления первичного ключа будет использовать существующий уникальный индекс. Поэтому, когда вы отбрасываете первичный ключ, он удаляет не индекс, а только первичный ключ. ==> Думаю, это твоя ситуация ...
2) При создании таблицы вы определяете первичный ключ ИЛИ при добавлении первичного ключа, когда не было существующего уникального индекса для столбца (столбцов), для которого должен быть определен первичный ключ, поэтому система создаст уникальный индекс и будет использовать его для первичный ключ. Таким образом, в этом случае, когда вы отбрасываете первичный ключ, уникальный индекс также будет удален.