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

时间:2018-01-17 05:27:43

标签: mysql sql sql-delete

我有表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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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