在级联删除中触发调用

时间:2011-05-18 07:07:16

标签: mysql triggers cascade cascading-deletes

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

4 个答案:

答案 0 :(得分:27)

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

  

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

换句话说,您无法使用级联删除触发器。

另见相关错误:

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

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

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

最好的部分是,当Oracle最终修复此 Bug 时,您只需从该表中删除触发器代码。瞧!

答案 3 :(得分:0)

很遗憾,这是一个错误。但是我们可以做一些事情来实现我们所需要的。无需为CASCADE更新或删除定义外键,您可以通过触发来实现。

例如,如果您有2个表categoriessubcategories,并且有一个分配给子类别的外键,那么在删除类别时,其子类别应自动删除。您可以不使用外键并使用如下所示的触发器来实现相同的功能:

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

这现在可以让您执行其他触发器工作。

我希望这会有所帮助。