Как удалить условные родительские дочерние отношения в SQL - PullRequest
0 голосов
/ 29 августа 2018

У меня есть родительские дочерние отношения A, B и C, и я хотел бы удалить строки в соответствии со следующими правилами:

  1. Если C существует, удалить C
  2. тогда, если B не имеет Cs, удалите B
  3. тогда, если A не имеет Bs, удалите A

Интересно, как должен выглядеть запрос SQL (MySQL версии 7) для реализации этих правил. Правила должны применяться к одному запросу или хранимой процедуре.

enter image description here

Моей первой идеей было использовать 'Common Table Expression', но обнаружил, что это доступно в MySQL версии 8.

Может ли кто-нибудь указать мне правильное направление?

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Я думаю, вы ищете что-то вроде этого

SELECT Employees.ID, COUNT(Orders.OrderID) AS NumberOfOrders
FROM (Employees
LEFT JOIN Orders ON Orders.EmployeeID = Employees.EmployeeID)
GROUP BY Employees.ID
HAVING COUNT(Orders.OrderID) = 0;

Где сотрудники = A и заказы = B

0 голосов
/ 29 августа 2018
  1. Для C нарушение ограничений отсутствует.
  2. DELETE FROM B WHERE NOT EXISTS(SELECT * FROM C where idB = B.id)
  3. DELETE FROM A WHERE NOT EXISTS(SELECT * FROM B where idA = A.id)

Таким образом, вы проверяете, будет ли нарушен внешний ключ перед выполнением удаления. Для больших таблиц вы должны рассмотреть возможность добавления индексов.

0 голосов
/ 29 августа 2018

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

Триггеры выполняются в ответ на другие изменения в базе данных автоматически, поэтому они будут обрабатываться для вас неявно, когда вы выполняете другие действия (например, удаление строки из B или C).

Вот пример из другого поста: phpMyAdmin создает триггер для удаления родительской строки, когда дочерних строк не существует .

У вас может быть один триггер, обрабатывающий родительское отношение B-C, и один, обрабатывающий A-B. Я считаю, что они должны быть в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...