Ответ
Каскадное удаление — это опция ограничения внешнего ключа (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 связанных записей. Хорошего дня!». И ты такой: «Охуеть...».
Короче, инструмент мощный, но им можно и себе все ебальник разнести, если бездумно тыкать. Думай, блядь, головой!