gpt4 book ai didi

mysql - SQL 删除所有子项的所有行

转载 作者:行者123 更新时间:2023-11-30 00:12:24 26 4
gpt4 key购买 nike

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:该数据库处于开发模式,因此仍在添加新表和约束。

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

最佳答案

假设您要删除 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

关于mysql - SQL 删除所有子项的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23941635/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com