在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: 数据库处于开发模式,因此仍在添加新表和约束。
我没有拥有级联删除的数据库。我可以将级联删除添加到发送给我的副本中,但这与使用我今天的脚本一样多。
答案 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