我有一个父子关系A,B和C,并希望按照以下规则删除行:
我想知道SQL(MySQL版本7)查询应如何实现此规则。规则必须适用于一个查询或存储过程。
我的第一个想法是使用“公用表表达式”,但发现它在MySQL版本8中可用。
有人能指出我正确的方向吗?
答案 0 :(得分:1)
DELETE FROM B WHERE NOT EXISTS(SELECT * FROM C where idB = B.id)
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的地方