我有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