2010-08-26 69 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,然後在最後重新命名。

相關問題