SQL удаляет строки с ограничениями

#sql #oracle #constraints #sql-delete

#sql #Oracle #ограничения #sql-удалить

Вопрос:

Я делаю несколько упражнений, и для этого я хочу удалить строку, на которую ссылается первичный / внешний ключ.

Можно ли удалить эти строки, не удаляя те, с которыми он связан? (как при каскадном удалении)

Я также знаю, что могу отключить ограничения, однако я хочу попробовать удалить, не отключая ограничения.

Комментарии:

1. Я потерялся. Причина отключения ограничений заключается в том, чтобы делать то, что вы хотите сделать. Почему вы не хотите их отключать?

2. Вы можете изменить их на on delete set null

3. @GordonLinoff я всегда думал, что в этом есть риск. если нет, то я бы сделал это без вопросов.

4. @Sejachu . , , Риск отключения ограничений заключается в том, что вы влияете на целостность данных. Похоже, вы хотите нарушить целостность своих данных, поэтому я не вижу особого дополнительного риска.

5. @GordonLinoff Я бы включил ограничения после удаления строк. Будет ли это по-прежнему влиять на целостность данных?

Ответ №1:

Строка всегда может быть удалена, если на ее первичный ключ не ссылаются как на внешний ключ в строке из другой таблицы. В этом случае попытка удаления строк приведет к ошибке при обнаружении связи первичного / внешнего ключа с данными. Эту ON DELETE CASCADE опцию можно использовать для обхода этой проблемы и удаления записей из дочерней таблицы при удалении строк из родительской таблицы.

Если вы хотите удалить только строки, которые не имеют связи, вы можете исключить строки, которые имеют связь, из операции удаления с помощью NOT EXISTS :

 DELETE FROM table1 a
WHERE NOT EXISTS (
   SELECT FROM table2 b
   WHERE b.table1Id = a.id
)