SQL删除所有子项的所有行

时间:2014-05-29 19:41:43

标签: mysql

在MySQL中是否可以基于父表递归删除所有子节点?

假设我有

+-------+
|TBL1.id|  
+-------+  

+-------+--------------------------+  
|TBL2.id|TBL2.parentId (FK TBL1.id)|  
+-------+--------------------------+  

+-------+--------------------------+
|TBL3.id|TBL3.parentId (FK TBL2.id)|  
+-------+--------------------------+  

现在,我无法删除TBL1中的所有行,因为TBL2引用了TBL1.id,我无法删除TBL2,因为TLB3引用了TBL2。

是否可以使用MySQL生成SQL查询,该查询将列出必须删除表的顺序?或者列出表的依赖关系,从最远的孩子开始?

我不想删除表,只删除一组表及其子项及其子项的所有行,...

目前我有几个脚本,每个父表一个删除所有孩子,但我想自动化。

编辑1: 数据库处于开发模式,因此仍在添加新表和约束。

我没有拥有级联删除的数据库。我可以将级联删除添加到发送给我的副本中,但这与使用我今天的脚本一样多。

1 个答案:

答案 0 :(得分:0)

假设您要删除TBL1上ID等于5的所有行以及表中的所有相关行:TBL2和TBL3,您可以在单个事务中执行此操作:

START TRANSACTION
DELETE FROM TBL3 WHERE EXISTS (SELECT 1 FROM TBL2 JOIN TBL1 ON TBL1.id = TBL2. parentId AND TBL1.id = 5 WHERE id = TBL3.parentId);
DELETE FROM TBL2 WHERE EXISTS (SELECT 1 FROM TBL1 WHERE id = TBL2.parentId AND id = 5);
DELETE FROM TBL1 WHERE id = 5;
COMMIT

如果您遵循表中的约定命名字段,则可以使用PLSQL查询INFORMATION_SCHEMA.TABLES视图来动态生成脚本:

SELECT table_name, column_name FROM INFORMATION_SCHEMA.TABLES t
   JOIN INFORMATION_SCHEMA.COLUMNS c ON c.table_name = t.table_name AND table_schema = 'db_name' 
  WHERE table_schema = 'db_name'
  AND table_name LIKE 'TBL_' AND column_name LIKE 'parentId'
  ORDER BY table_name DESC