【问题标题】:Cascading deletes like ON DELETE CASCADE for a one time operation in MySQL级联删除,如 ON DELETE CASCADE 用于 MySQL 中的一次性操作
【发布时间】:2013-10-28 17:43:41
【问题描述】:

是否有某种神奇的 SQL 语句来删除一行及其所有依赖项(由外键约束链接)更改表以添加 ON DELETE CASCADE 或手动删除每个依赖行?

我在幻想诸如DELETE FROM `table_a` WHERE `id` = 1 ON DELETE CASCADE; 之类的东西,但我似乎在文档@http://dev.mysql.com/doc/refman/5.5/en/delete.html 中找不到任何类似的东西

  • 我不想ALTER 表只更改一次操作的约束,然后使用另一个ALTER 恢复它
  • 我不想为每个包含 FK 到 table_a 的表执行类似 DELETE FROM `table_b` WHERE `a_id` = 1; 的操作

在 InnoDB 中使用 MySQL 5.5

【问题讨论】:

    标签: mysql sql foreign-keys


    【解决方案1】:

    不,简单的答案是,不,没有捷径。

    您要么写下DELETE 语句以删除相关表中的所有相关行,要么使用ON DELETE CASCADE 定义外键约束。

    请注意 - 只要外键关系中没有循环路径 - 就可以使用从多个表中删除的单个 DELETE 语句:

    DELETE a, b, c, d
    FROM a
      LEFT JOIN b  ON  b.a_id = a.a_id
      LEFT JOIN c  ON  c.a_id = a.a_id
      LEFT JOIN d  ON  d.b_id = b.b_id 
    WHERE
        a.a_id = 1 ;
    

    【讨论】:

    • 真是太糟糕了......无论如何,我忘记了使用带有 JOIN 的单个 DELETE 语句,谢谢你的建议。
    • 不幸的是,正如here 和mysql documentation 指出的那样,没有办法控制删除的顺序,所以这可能仍然会失败。我刚刚学到了很多东西......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 2013-09-20
    • 1970-01-01
    相关资源
    最近更新 更多