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

时间:2018-08-29 15:32:49

标签: mysql sql

我有一个父子关系A,B和C,并希望按照以下规则删除行:

  1. 如果C存在,请删除C
  2. 然后,如果B没有C,请删除B
  3. 然后,如果A没有B,请删除A

我想知道SQL(MySQL版本7)查询应如何实现此规则。规则必须适用于一个查询或存储过程。

enter image description here

我的第一个想法是使用“公用表表达式”,但发现它在MySQL版本8中可用。

有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:1)

  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)

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

答案 1 :(得分:0)

我通常避免使用它们,因为它们在过度使用时会引起性能噩梦,但这听起来很像是触发器的确切用例,假设您始终希望这种情况发生。

触发器是根据数据库中的其他更改自动执行的,因此当您执行其他操作(例如从B或C中删除一行)时,将为您隐式处理。

这是另一个帖子中的示例:phpMyAdmin create a trigger for deleting a parent row when no child rows exist

您可以有一个触发器来处理B-C父关系,而另一个可以处理A-B。我相信他们应该没事。

答案 2 :(得分:0)

我认为您正在寻找类似的东西

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的地方