72 похожих чатов

#Вопрос Ребят, нужна помощь)) PostgreSQL 12 Есть 3 таблицы: CREATE TABLE products (

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; удалились все данные из таблиц?

7 ответов

2 просмотра

Во-первых, никак. Потому что только один уровень FK удаляется. Во-вторых, вот есть у тебя заказ, в нём три товара (продукта). Ты удаляешь один продукт из таблицы "продукты". Ну, ок, одна запись из состава заказа удаляется. Две — отсаётся. Ты предлагаешь удалять такой заказ?

Это можно сделать, но либо процедурой, либо триггерами, либо просто — логикой приложения.

Эээ... а как эти все таблицы связаны / какие в них ключи? Непосредственно по вопросу — ну, триггер, например... но Вы уверены, что Вам это надо (выше @MasterZiv написал, почему)?

Вообще, какскадные удаления — это в 90% ужасная глупость и зло. Бизнес-логике это в 90% случаев не нужно, а нужно ей , наоборот, действие RESTRICT по FK

Adv0cat- Автор вопроса
Ilya Zviagin
Во-первых, никак. Потому что только один уровень F...

Ну на самом деле это лишь самый простой пример, который смог привести. У меня несколько иначе)) Если в этом примере, то грубо говоря у меня просто генерируется сначало product, на основании его генерируется orders, поэтому если удлаен конкретный product, все связанные orders мне больше не нужны и их надо удалить, хотел сделать это красиво одним удалением product, но видимо как вы и сказали - это нельзя, и нужно выбрать сначало все связанные orders, потом удалить product c референсом в order_items, а потом уже удалять все orders, тобишь “логикой приложения”, окей, спасибо))

Adv0cat
Ну на самом деле это лишь самый простой пример, ко...

Вообще, это в чистом виде бизнес- логика.

Adv0cat- Автор вопроса
Ilya Zviagin
Вообще, это в чистом виде бизнес- логика.

Ну т.е. именно у меня не бизнес логика, а скажем так есть динамически генерируемая иерархия каких-то штук. Мы генерируем парента под юзера, у этого парента генерируем его чайлдов под этого юзера, а у чайлдов еще генерируем чайлдов под этого чайлда. Грубо говоря в какойто момент юзер перестает использовать парента, или хочет перегенерировать чайлдов, соответственно нигде больше это не будет использоваться. я хотел удалив парента или один чайлд, чтобы парент, все чайлды и все чайлды чайлдов были удалены каскадно за один присест и потом заново сгенерировать при необходимости все что мне нужно))

Похожие вопросы

Обсуждают сегодня

Сonst magicTgHTML = (text, entities) => { let processedText = text; let offsetShift = 0; entities.forEach(entity => { const { offset, length, type, url, ...
Андрей
1
это группа токсиков или тех кто помогает?
Ибрагим
9
В смысле более затратная? Общая стоимость владения лошадью меньше, чем автомобиля. В среднем.
Sergej R
10
всем привет. подскажите. сделал политику, он верхнеуровневая. раздал права только на TEST2 (полные). вопрос - можно ли сделать так, чтобы был доступен только TEST2, а остально...
Андрей Сергеев
5
коллеги привет. уже второй день бьемся об заклад с одной ошибкой, может вы сталкивались с таки странным поведением? есть тестовый сервер, на который паблишим релизную версию W...
Magzhan
11
Гайз, кто-нибудь пробовал запустить probe-rs под камень, которого нет в probe-rs? Мб есть какой-нибудь пример у кого... Через target-gen попробовал сгенерировать chip-descript...
Максим Смирнов
2
Кстати, раз про скачивание файлов разговор зашел) Сделал бота для себя (транскрибирующего и суммаризирующего встречи) но не ожидал что за 2 месяца 10к пользователей набежит😅...
Andrey Obolenskiy
8
Добрый день, подскажите, пожалуйста, кто может помочь? Заказал Orange Pi AiPro, но не могу скачать на него официальное программное обеспечение, так как оно доступно только на ...
Ivan
2
t.me/<username> и tg://user?id=<id> отваливаются по понятным причинам
Denis 🐍|👑 | darling! 🥰
7
Вы когда из вики.... копировали, не обратили внимание на года(ы)? 😉 ==== если до 1917 года в Москве было около 15 000 легковых извозчиков, то к 1920 году их осталось 5 000, а ...
Igor Mitin
4
Карта сайта