2010-08-26 61 views
12

我有2个表格:commentscomments_likes在不调用触发器的情况下在mysql中进行查询(如何禁用触发器)


评论

id  
message 
likes 

触发

AFTER DELETE

DELETE FROM comments_likes WHERE comment_id = OLD.id; 

comments_likes

id   
comment_id 

触发

AFTER INSERT

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

AFTER DELETE

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

UPDATE

**omited code, updates comments** 

所以现在的问题是后,可以从另一个触发激活他们当我禁用触发器?

我要的是做一些喜欢这样的:

AFTER DELETE

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不起作用。

[EDIT 2]

我有另一个想法,可以设置一个全局变量中的第一触发器,并从其他触发读吗?

例:

第一触发:

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

其他触发:

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

回答

21

禁止触发器可以这样做:

触发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; 
+0

Ineresting!你真的可以禁用触发器内的触发器吗? – Mchl 2010-08-26 20:59:07

+1

@Mchl:是的,用这种方法你可以:) @var是连接的全局变量。您必须使用IS NULL,因为尚未定义的变量始终为NULL。 – Wiliam 2010-08-27 15:41:17

+1

4年后这帮了我!我正在寻找这样的东西。经过1个小时的谷歌搜索和搜索后,我终于找到了答案。这很容易,但我从来不会自己想出来的。我只是不习惯用mysql来“编程”。 – 2014-09-10 12:11:29

0

你就是不行。这就是触发点:始终运行。

此外,我不明白为什么你会需要你的情况。最糟糕的是没有更新 - 不会出现任何错误。

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

+0

当您尝试删除评论时,触发器会删除所有喜欢。当喜欢被删除时,他们更新已被删除的评论。出现错误消息:'不能更新存储的函数/触发器中的表'注释',因为它已经被调用此存储函数/触发器的语句使用' – Wiliam 2010-08-26 17:21:46

+0

@Wiliam:嗯,有条件我可以做到这一点......但不是我正在寻找的解决方案 – Wiliam 2010-08-26 17:28:52

+0

@Mchl也许这就是触发器的要点,但是在MySQL中它们并不总是被执行。如果一行由于CASCADE外键约束强制而被删除,则不会执行任何触发器。参考:[MySQL文档](http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html)。我坚信MySQL的这种限制的根源与William评论中的错误具有相同的根源。 – 2015-02-23 19:21:32

1

可以有点难看,但我做的是重新命名表到触发器没有附加的表2,然后在最后重新命名。