基于先前删除的子行删除父行

9vw9lbht  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(284)

我有a、b和c表。表a是b和c的父表。现在,在我的批处理文件中,它有一个delete语句,从表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的主键)等于从表a中删除的记录 DELETE 上面的陈述。
此外,表b和表c都有一列(比如,表a\ 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
)

思想?
编辑:我有同样的问题,但这是基于甲骨文:https://dba.stackexchange.com/questions/49634/delete-rows-in-parent-table-based-on-criteria-in-child-table-oracle

j8ag8udp

j8ag8udp1#

您可以使用cascade delete选项创建外键索引来删除其他表中的记录。
在本例中,使用having cascade delete选项在b和c中创建外键索引。因此,在a中删除记录时,其他表中相应的键值也将被删除。
参考http://www.mysqltutorial.org/mysql-on-delete-cascade/

p3rjfoxz

p3rjfoxz2#

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

相关问题