【问题标题】:Trigger calls in cascade deleting在级联删除中触发调用
【发布时间】:2011-05-18 07:07:16
【问题描述】:

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

【问题讨论】:

  • 这是在应用程序代码中执行逻辑的参数,而不是触发器和级联的复杂设置。

标签: mysql triggers cascade cascading-deletes


【解决方案1】:

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

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

换句话说,您不能将触发器与级联删除一起使用。

另见相关错误:

【讨论】:

  • 我每天都更讨厌mysql
  • 我刚刚发现了这个问题,而且非常愚蠢:-(
  • @NeilMcGuigan mysql 5.7.9 还不支持此属性?
  • @NeilMcGuigan 你是说 5.7.9 确实支持这个吗?
  • 对不起,我想回复@yonessafari。要回答这个问题,它仍然是一个错误:bugs.mysql.com/bug.php?id=11472
【解决方案2】:

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

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

【讨论】:

  • 使用另一个触发器进行删除不是正确的方法。因为如果我在tableA上有一个触发器并删除了tableB中的一行,并且如果我在tableB上有一个触发器来更新tableA,那么就会发生冲突。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

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

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

    现在,您可以正常使用其他触发器。

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 2014-08-23
      相关资源
      最近更新 更多