根据之前删除的子行删除父行

Posted

技术标签:

【中文标题】根据之前删除的子行删除父行【英文标题】:Delete parent rows based on previously deleted child rows 【发布时间】:2018-01-17 05:27:42 【问题描述】:

我有表 A、B 和 C。表 A 是 B 和 C 的父表。现在,在我的批处理文件中,它有这个删除语句,它从表 B 和 C 中删除记录:

DELETE b.*, c.*
FROM tableB AS b
LEFT JOIN tableC AS c
   ON c.tableB_id = b.id
WHERE c.date IS NULL
AND DATE(c.updated_at) != CURDATE()

我想要做的是从表 A 中删除所有记录,其中 id(表 A 的主键)等于从上面的 DELETE 语句中删除的记录。

此外,表 B 和 C 都有一个列(例如 tableA_id),它是表 A 的外键。我尝试了以下查询,但我认为这不是正确的做法,因为它们不是基于上述DELETE 声明:

DELETE a FROM tableA a
WHERE a.id NOT IN (
    SELECT b.tableA_id FROM tableB b
)

DELETE a FROM tableA a
WHERE a.id NOT IN (
    SELECT c.tableA_id FROM tableC c
)

想法?

编辑:我也有同样的问题,但它基于 oracle:https://dba.stackexchange.com/questions/49634/delete-rows-in-parent-table-based-on-criteria-in-child-table-oracle

【问题讨论】:

您的要求可能有点偏离。你是说如果我从BC 中删除一个子记录,那么整个A 应该被删除?如果还有其他(未删除的)子项仍在引用A,这可能会导致键约束错误。似乎您希望在这里使用ON DELETE CASCADE,但再次将删除从子级级联删除到父级是没有意义的。 【参考方案1】:

您必须先删除带有外键的表,然后才能删除它们引用的原始记录。但是您可以编写一个脚本,从表 B 和 C 中收集表 A 中记录的 id。删除 B 和 C 中的记录,然后循环遍历 id 列表以将它们从表 A 中删除。

【讨论】:

【参考方案2】:

您可以使用级联删除选项创建外键索引以删除其他表中的记录。

在您的情况下,在 B 和 C 中创建外键索引,A 具有级联删除选项。因此,当您删除 A 中的记录时,其他表中的相应键值也将被删除。

参考 http://www.mysqltutorial.org/mysql-on-delete-cascade/

【讨论】:

以上是关于根据之前删除的子行删除父行的主要内容,如果未能解决你的问题,请参考以下文章

选择所有子行都符合条件的父行

如果在mysql中删除父行,如何自动删除所有引用行?

jquery DataTables 父行和子行作为一条记录而不是两条记录发布到服务器

HTML:如何使用 AngularJs 填充第一行是父行和后续行是子行的行

无法删除或更新父行 - Java

如何解决这个问题 - 无法删除或更新父行:外键约束失败