我有2个表格:comments
和comments_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 PRIORITY
和IGNORE
不起作用。
[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;
Ineresting!你真的可以禁用触发器内的触发器吗? – Mchl 2010-08-26 20:59:07
@Mchl:是的,用这种方法你可以:) @var是连接的全局变量。您必须使用IS NULL,因为尚未定义的变量始终为NULL。 – Wiliam 2010-08-27 15:41:17
4年后这帮了我!我正在寻找这样的东西。经过1个小时的谷歌搜索和搜索后,我终于找到了答案。这很容易,但我从来不会自己想出来的。我只是不习惯用mysql来“编程”。 – 2014-09-10 12:11:29