Удалить строку с ограничениями внешнего ключа и без каскадного удаления 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;
Другие вопросы по тегам