代码之家  ›  专栏  ›  技术社区  ›  Simon

如何在SQL中删除条件父子关系

  •  1
  • Simon  · 技术社区  · 6 年前

    我有一个父子关系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 回复  |  直到 6 年前
        1
  •  1
  •   Oscar Martinez    6 年前
    1. DELETE FROM B WHERE NOT EXISTS(SELECT * FROM C where idB = B.id)
    2. DELETE FROM A WHERE NOT EXISTS(SELECT * FROM B where idA = A.id)

    通过这种方式,您可以在执行删除之前检查是否会违反外键。对于大型表,您应该考虑添加索引。

        2
  •  0
  •   John Humphreys    6 年前

    我通常避免使用它们,因为它们在过度使用时会导致性能的噩梦,但这听起来几乎就是触发器的确切用例,假设您总是希望这样做。

    下面是另一篇文章中的一个例子: phpMyAdmin create a trigger for deleting a parent row when no child rows exist .

        3
  •  0
  •   Puddles    6 年前

    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