Получить доступ

Чем опасно объявление внешнего ключа с ON DELETE CASCADE?

MiddleМоделирование данныхSQL
Ещё спрашивают так:
  • Когда использовать ON DELETE CASCADE?
Коротко

Удаление одной строки может рекурсивно удалить тысячи связанных строк по цепочке внешних ключей — и это не видно из кода приложения.

  • Уместно для настоящих частей целого: позиции заказа при удалении черновика
  • Для важных данных — RESTRICT и явное удаление в коде, мягкое удаление
  • Каскад по большой таблице — долгие блокировки и большой WAL

А ещё Без индекса на ссылающейся колонке каскад ещё и медленный

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Каскад удобен для строго подчинённых данных, которые вне владельца не имеют смысла — например, позиции заказа. Но для сущностей, на которые ссылаются другие части системы, он превращается в мину: удаление клиента уносит заказы, платежи и историю, а восстановление возможно только из резервной копии. Дополнительно каскадное удаление берёт блокировки на все затронутые строки и способно надолго заблокировать таблицы. Более безопасные варианты — ON DELETE RESTRICT, чтобы удаление падало с ошибкой, или ON DELETE SET NULL, а также мягкое удаление флагом. И отдельная практическая деталь: по колонкам внешних ключей стоит держать индексы, иначе проверка ссылочной целостности при удалении родителя выльется в полное сканирование.

Что хотят услышать

  • Риск неочевидного массового удаления.
  • Где каскад уместен, где нет.
  • Альтернативы: RESTRICT, мягкое удаление.

Частые ошибки

  • Ставить каскад на связи между независимыми сущностями.
  • Забывать индекс на колонке внешнего ключа.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Одно удаление способно тихо снести большое дерево связанных строк, и в приложении этот эффект не виден по коду
  • ✗Каскад отключает проверку целостности
  • ✗Каскад работает только в пределах одной таблицы
  • ✗Каскад запрещает создание индексов по внешнему ключу

Что спросят дальше

  • Почему индекс на внешнем ключе важен при удалении родителя?
  • Когда мягкое удаление лучше физического?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем