【问题标题】:Make a query in mysql without invoking a trigger (How to disable a trigger)在不调用触发器的情况下在 mysql 中进行查询(如何禁用触发器)
【发布时间】:2011-04-04 09:36:41
【问题描述】:

我有 2 张桌子:commentscomments_likes


cmets

id     
message
likes  

触发器

删除后

DELETE FROM comments_likes WHERE comment_id = OLD.id;

cmets_likes

id        
comment_id

触发器

插入后

UPDATE comments SET likes = likes + 1 WHERE comments.id = NEW.comment_id;

删除后

UPDATE comments SET likes = likes - 1 WHERE comments.id = OLD.comment_id;

更新后

**omited code, updates comments**

所以问题是,我可以在从另一个触发器激活触发器时禁用触发器吗?

我想要的是做这样的事情:

删除后

IF NOT called_from_another_trigger() THEN
    UPDATE comments SET likes = likes - 1 WHERE comments.id = OLD.comment_id;
END IF;

[编辑]

一个未优化的解决方案是(非常慢的查询...对每个 LIKE 寄存器进行查询):

BEGIN
    IF (SELECT id FROM comments WHERE comments.id = OLD.comment_id) THEN
        UPDATE comments SET comments.cache_likes = comments.cache_likes - 1 WHERE comments.id = OLD.comment_id;
    END IF;
END

更新 LOW PRIORITYIGNORE 不起作用。

[编辑 2]

我有另一个想法,可以在第一个触发器中设置一个全局变量,然后从另一个触发器中读取它吗?

例如:

第一次触发:

@disable_triggers = true;
// do the stuff that calls another triggers
@disable_triggers = false;

其他触发器:

if @disable_triggers = false then
    // do the stuff
end if;

【问题讨论】:

    标签: mysql triggers myisam


    【解决方案1】:

    可能有点难看,但我所做的是将表重命名为 table2,触发器也没有附加,然后最后重命名。

    【讨论】:

      【解决方案2】:

      要禁用触发器,您可以这样做:

      触发器 1

      SET @disable_trigger = 1;
      // do stuff that calls trigger 2
      SET @disable_trigger = NULL;
      

      触发器 2

      IF @disable_trigger IS NULL THEN
          // do stuff only if called from a query and not from trigger 1
      END IF;
      

      【讨论】:

      • 有趣!你真的可以在触发器中禁用触发器吗?
      • @Mchl:是的,使用这种方法你可以:) @var 是连接的全局变量。您必须使用 IS NULL,因为尚未定义的变量始终为 NULL。
      • 这在 4 年后帮助了我!我正是在寻找这样的东西。经过 1 小时的谷歌搜索和搜索,我终于找到了你的答案。这很容易,但我自己永远也想不通。我只是不习惯用mysql“编程”。
      【解决方案3】:

      不,你不能。这就是触发器的意义所在:始终运行。

      此外,我不明白你为什么需要它。最坏的情况是没有任何更新 - 不会引发错误。

      您始终可以在触发器中添加条件,以检查它们(或它们的部分代码)是否应该运行(例如,相关表中是否有记录)。

      【讨论】:

      • 当您尝试删除评论时,触发器会删除所有喜欢的内容。当喜欢被删除时,他们会更新已删除的评论。出现错误消息:Can't update table 'comments' in stored function/trigger because it is already used by statement which invoked this stored function/trigger
      • @Wiliam:嗯,有条件我可以做到……但这不是我正在寻找的解决方案。u
      • @Mchl 也许这就是触发器的重点,但在 MySQL 中它们并不总是被执行。如果由于 CASCADE 外键约束强制而删除了一行,则不会执行任何触发器。参考:MySQL documentation。我坚信 MySQL 的这种限制的根源与 William 评论中的错误的根本原因相同。
      猜你喜欢
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 2013-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多