Что такое каскадное удаление (ON DELETE CASCADE) в SQL?

Ответ

Каскадное удаление — это опция ограничения внешнего ключа (FOREIGN KEY) в реляционных базах данных. При её использовании удаление записи из родительской (главной) таблицы автоматически приводит к удалению всех связанных с ней записей в дочерней (подчинённой) таблице.

Цель и пример:

Гарантирует ссылочную целостность данных, предотвращая появление "висячих" ссылок (orphaned records) в дочерней таблице.

-- Родительская таблица
CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,
    Name VARCHAR(100)
);

-- Дочерняя таблица с каскадным удалением
CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    OrderDate DATE,
    FOREIGN KEY (CustomerID)
        REFERENCES Customers(CustomerID)
        ON DELETE CASCADE -- Ключевая опция
);

Что произойдёт:

DELETE FROM Customers WHERE CustomerID = 123;

Эта команда удалит клиента с ID 123 из таблицы Customers и все его заказы из таблицы Orders.

Альтернативы и важные замечания:

  • ON DELETE SET NULL: Внешний ключ в дочерней таблице устанавливается в NULL.
  • ON DELETE SET DEFAULT: Внешний ключ устанавливается в значение по умолчанию.
  • ON DELETE NO ACTION / RESTRICT: Удаление родительской записи запрещено, если существуют зависимые дочерние записи (стандартное поведение во многих СУБД).
  • Осторожность: CASCADE может привести к масштабной и неожиданной потере данных. Всегда проверяйте связи перед выполнением удаления.

Ответ 18+ 🔞

А, каскадное удаление! Ну это ж классика, блядь, как та самая Муму — вроде доброе дело делает, а потом раз — и всех в озеро, в пизду, вместе с мешком!

Смотри, вот представь: есть у тебя таблица Customers, ну, клиенты там, бабки, всё дела. А есть таблица Orders — заказы этих самых клиентов. Они связаны, как Герасим с той собакой, блядь. Клиент — родитель, заказы — его дети-пёсики.

Так вот, если ты возьмёшь и удалишь клиента, а заказы его останутся, это будет пиздец. Заказы будут тыкаться в пустоту, как слепые щенки, и орать: «А где наш папа-клиент, блядь?». Это и есть «висячие ссылки» — хуйня полная, целостность данных ебнулась.

Чтобы такого не было, умные дядьки придумали ON DELETE CASCADE. Это как максимализм Герасима, ёпта. Увидел, что барыня недовольна — и сразу, блядь, радикально! Удалил клиента — и ВСЕ его заказы автоматом летят в корзину, одним махом. Чисто, аккуратно, сирот не остаётся.

FOREIGN KEY (CustomerID)
    REFERENCES Customers(CustomerID)
    ON DELETE CASCADE -- Вот эта хуйня!

Выполнил DELETE FROM Customers WHERE CustomerID = 123; и пошла жара! Клиент 123 — нахуй, и все его заказы — туда же, следом, как по волшебству. Удобно? Ебать да! Опасно? Овердохуища!

Потому что есть и другие, менее кровожадные варианты, блядь:

  • ON DELETE SET NULL: Это по-хитрому. Удалил папашу-клиента, а дети-заказы остаются, но теперь у них в графе «папа» стоит NULL. Сироты при живых родителях, но хоть живы. «Мой папа — неизвестный мужик».
  • ON DELETE RESTRICT (или NO ACTION): А это вообще мудрость, блядь. Система тебе говорит: «Э, дружок-пирожок, пошёл нахуй! Не удалишь ты клиента, пока у него заказы висят. Сначала разберись с ними». Как охрана в клубе: «Не ногой сюда, пока не рассчитаешься!».
  • ON DELETE SET DEFAULT: Ну это вообще лотерея. Удалили родного папу, а детям подсунули какого-то дефолтного мужика со значением по умолчанию. «Теперь твой папа — Вася Пупкин (стандартный)».

Главное замечание, блядь, слушай сюда: CASCADE — это оружие массового поражения в твоей базе. Ты один раз чихнул, а у тебя полторы тысячи записей накрылось медным тазом. Проверяй связи, блядь, десять раз думай, прежде чем на такую хуйню подписываться. А то будет как в том анекдоте: «Удалить пользователя?» — «Да» — «Вы удалили 1 пользователя и 8473 связанных записей. Хорошего дня!». И ты такой: «Охуеть...».

Короче, инструмент мощный, но им можно и себе все ебальник разнести, если бездумно тыкать. Думай, блядь, головой!