Удалить строку с ограничениями внешнего ключа и без каскадного удаления SQL
Попытка выяснить, как удалить строку в таблице SQL с несколькими внешними ключами, указывающими на нее, и большим количеством ключей, указывающих на них, и т. Д., И т. Д. Каскадные удаления не включены (я не могу их включить) и я пытаюсь не выполнять удаление КАЖДОЙ отдельной строки, на которую влияет это удаление.
Итак, если у меня есть таблица XXX со столбцами YYY и ZZZ, где YYY - это первичный ключ, а ZZZ - это столбец, имеющий несколько внешних ключей, указывающих на него, как я могу удалить строку на основе значения первичного ключа?
Синтаксис будет следующим: УДАЛИТЬ ИЗ XXX ГДЕ ГГГГ = some_value
Это вообще возможно (без выполнения тонны отдельных удалений)? И если так, как бы я это сделал?
2 ответа
Нет.
Либо вам нужны ограничения внешнего ключа для каскадного удаления (то, что мне не очень нравится, для некоторых приложений / разработчиков слишком легко думать, что они могут удалять и повторно вставлять некоторые данные, а не обновлять их на месте без случайного вызывая удаление всех дочерних строк), или вам нужно удалить дочерние строки перед удалением родительских строк.
Обычно, если вы хотите удалить данные из дочерних таблиц, проще просто вручную записать различные DELETE
заявления. Можно было бы запросить словарь данных (dba_constraints
, dba_cons_columns
и т. д.) и динамический SQL, чтобы обойти все ограничения и генерировать соответствующие DELETE
заявления. В подавляющем большинстве случаев это не имеет смысла, если вы не пытаетесь delete
операторы для большого количества таблиц.
Как насчет отключения проверки ограничений внешнего ключа?
SET FOREIGN_KEY_CHECKS = 0;
Затем включить его обратно при удалении строки?
SET FOREIGN_KEY_CHECKS = 1;