级联删除时触发调用

问题描述 投票:0回答:5

我在 MySQL 中有表“A”。它有一些对其他表(“B”、“C”、“D”...)的级联删除的引用。当从“A”中删除某些内容时,我需要使用触发器。当我直接从“A”删除记录时,此触发器起作用。但它不适用于级联删除。 是否存在任何版本的 MySQL 可以让我的触发器与级联删除一起使用?或者,也许还有另一种打电话方式

mysql triggers cascade cascading-deletes
5个回答
40
投票

来自 http://dev.mysql.com/doc/refman/5.6/en/innodb-restrictions.html

级联外键操作不会激活触发器

也就是说,不能使用触发器进行级联删除。

另请参阅相关错误:


8
投票

总结@Niel de Wet 和@Browny Lin 的答案:

  1. 遗憾的是,级联删除不会激活 MySQL 中的触发器。
  2. 一种解决方案是不使用级联删除,而是通过另一个触发器实现自动删除。

5
投票

让我分享一下从我发现这个问题存在的第一天起我是如何“解决”这个问题的。我将触发器从级联表复制到直接删除的第一个表中。它就是有效的。

很多时候这是复制/粘贴的问题,有时需要大量重写代码。

最好的部分是,当 Oracle 最终修复这个Bug时,您只需从上述表中删除触发代码即可。瞧!


1
投票

是的,不幸的是这是一个错误。但我们确实可以做一些事情来实现我们所需要的。您可以通过创建触发器来实现这一点,而不是为 CASCADE 更新或删除定义外键。

例如,如果您有 2 个表

categories
subcategories
,并且您有一个分配给子类别的外键,因此删除一个类别时,其子类别应该会自动删除。您可以在没有外键和使用触发器的情况下实现相同的功能,如下所示:

CREATE TRIGGER categories_delete AFTER DELETE ON categories
    FOR EACH ROW BEGIN
        DELETE FROM subcategories WHERE category_id = OLD.id;
    END;

现在您可以让其他触发器正常工作。

我希望这对你有帮助。


0
投票

FWIW,自首次报告以来已过去 18 年零 9 个月零 3 天,版本 8.0.36 中仍然存在此问题。

这么大的缺点还没有解决。令人难以置信!

© www.soinside.com 2019 - 2024. All rights reserved.