【发布时间】:2011-04-04 09:36:41
【问题描述】:
我有 2 张桌子:comments 和 comments_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 PRIORITY 和 IGNORE 不起作用。
[编辑 2]
我有另一个想法,可以在第一个触发器中设置一个全局变量,然后从另一个触发器中读取它吗?
例如:
第一次触发:
@disable_triggers = true;
// do the stuff that calls another triggers
@disable_triggers = false;
其他触发器:
if @disable_triggers = false then
// do the stuff
end if;
【问题讨论】: