product_id int primary key,
title text
);
CREATE TABLE orders (
order_id int primary key,
title text
);
CREATE TABLE order_items (
product_id int,
order_id int,
quantity int
);
Как сделать каскадное удаление так, чтобы при удалении produsts все связанные с ним orders тоже удалились, а не только из таблцы order_items?
Т.е. при таких данных
INSERT INTO products (product_id, title) VALUES (1, 'product1');
INSERT INTO orders (order_id, title) VALUES (1, 'order1');
INSERT INTO order_items (product_id, order_id, quantity) VALUES (1, 1, 42);
INSERT INTO order_items (product_id, order_id, quantity) VALUES (1, 1, 24);
Сделав DELETE FROM products WHERE product_id = 1; удалились все данные из таблиц?
Во-первых, никак. Потому что только один уровень FK удаляется. Во-вторых, вот есть у тебя заказ, в нём три товара (продукта). Ты удаляешь один продукт из таблицы "продукты". Ну, ок, одна запись из состава заказа удаляется. Две — отсаётся. Ты предлагаешь удалять такой заказ?
Это можно сделать, но либо процедурой, либо триггерами, либо просто — логикой приложения.
Эээ... а как эти все таблицы связаны / какие в них ключи? Непосредственно по вопросу — ну, триггер, например... но Вы уверены, что Вам это надо (выше @MasterZiv написал, почему)?
Вообще, какскадные удаления — это в 90% ужасная глупость и зло. Бизнес-логике это в 90% случаев не нужно, а нужно ей , наоборот, действие RESTRICT по FK
Ну на самом деле это лишь самый простой пример, который смог привести. У меня несколько иначе)) Если в этом примере, то грубо говоря у меня просто генерируется сначало product, на основании его генерируется orders, поэтому если удлаен конкретный product, все связанные orders мне больше не нужны и их надо удалить, хотел сделать это красиво одним удалением product, но видимо как вы и сказали - это нельзя, и нужно выбрать сначало все связанные orders, потом удалить product c референсом в order_items, а потом уже удалять все orders, тобишь “логикой приложения”, окей, спасибо))
Вообще, это в чистом виде бизнес- логика.
Ну т.е. именно у меня не бизнес логика, а скажем так есть динамически генерируемая иерархия каких-то штук. Мы генерируем парента под юзера, у этого парента генерируем его чайлдов под этого юзера, а у чайлдов еще генерируем чайлдов под этого чайлда. Грубо говоря в какойто момент юзер перестает использовать парента, или хочет перегенерировать чайлдов, соответственно нигде больше это не будет использоваться. я хотел удалив парента или один чайлд, чтобы парент, все чайлды и все чайлды чайлдов были удалены каскадно за один присест и потом заново сгенерировать при необходимости все что мне нужно))
Обсуждают сегодня