我有表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
答案 0 :(得分:0)
您必须先删除带有外键的表,然后才能删除它们引用的原始记录。但是您可以编写一个脚本,从表B和C中收集表A中的记录ID。删除B和C中的记录,然后遍历id列表以从表A中删除它们。
答案 1 :(得分:0)
您可以使用级联删除选项创建外键索引,以删除其他表中的记录。
在您的情况下,使用具有级联删除选项的A在B和C中创建外键索引。因此,当您删除A中的记录时,相应的键值也将在其他表中删除。