2014-09-05 90 views
-2

Mysql觸發器有什麼問題?Mysql觸發器有什麼問題?

CREATE TRIGGER ebdaa.active_cus AFTER UPDATE ON ebdaa.appoints 
    FOR EACH ROW 
    BEGIN 
     IF NEW.confirmed = 1 OR NEW.attend =1 THEN 
      update ebdaa.appoints SET NEW.active= 1 ; 
     END IF; 
    END; 
+2

你真的需要更清楚地提出這樣的問題。這是否導致錯誤?如果是這樣,錯誤是什麼?還是它做了一些不同於你認爲會做的事情?如果是這樣,你期望它做什麼,而發生了什麼?也就是說,我認爲在定義觸發器時,問題的原因可能是您沒有使用DELIMITER,因爲對於大多數使用觸發器的人來說,這是一個混亂點。 – 2014-09-05 17:32:18

回答

1

您需要更改分隔符,將觸發器設置爲before和刪除您的更新語句

delimiter | 
CREATE TRIGGER ebdaa.active_cus BEFORE UPDATE ON ebdaa.appoints 
FOR EACH ROW 
BEGIN 
    IF NEW.confirmed = 1 OR NEW.attend = 1 THEN 
     SET NEW.active = 1; 
    END IF; 
END 
| 
delimiter ; 
2

這裏是什麼地方錯了扳機:

1)SQL UPDATE語句中觸發器的身體無效。 NEW.active是對剛剛更新的行中的active列的值的引用。這是來自行的值,而不是列的名稱。

2)即使修改了SQL語句來解決該問題,我們也不希望對同一行發出後續的UPDATE語句。 (在一些數據庫中,這是不允許的,我很驚訝,MySQL的允許它。)

3)這是一個AFTER UPDATE觸發。我們認爲該觸發器的預期結果(即,在某一條件成立時將行中的列設置爲特定值)將在觸發器中更高效地實現。

下面是該active列設置爲1,當任confirmedattend列設置爲1觸發的例子:

USE ebdaa; 

DELIMITER $$ 

CREATE TRIGGER active_cus_bu 
BEFORE UPDATE ON appoints 
FOR EACH ROW 
BEGIN 
    IF (NEW.confirmed = 1 OR NEW.attend = 1) THEN 
     SET NEW.active = 1; 
    END IF; 
END$$ 

DELIMITER ; 
+1

MySQL允許它,並且觸發IF語句中的UPDATE語句的每個更新語句都將失敗。順便說一下,MySQL不會創建這個作爲AFTER UPDATE觸發器。 +1 – VMai 2014-09-05 17:58:58

+1

@VMai:我同意(我認爲)。如果MySQL允許'AFTER UPDATE'觸發器在同一行的同一個表上發出'UPDATE',那麼UPDATE語句會觸發觸發器,然後執行另一個UPDATE觸發觸發器,廣告無窮。 (MySQL必須在某個地方拋出一個錯誤來防止這種情況發生)。是的,將'NEW.col'設置爲值需要在** BEFORE UPDATE **觸發器中執行,而不是AFTER UPDATE。 (我可能沒有在我的答案中說清楚) – spencer7593 2014-09-05 19:02:14

+0

對於我來說,你的回答是清楚的,並處理了主要的兩個問題(包括重置DELIMITER):使用BEFORE UPDATE觸發器並使用簡單SET而不是更新可能導致確實產生錯誤消息(而不是無限循環)。對於BEFORE UPDATE觸發器中同一個表上的UPDATE,情況也是如此。 – VMai 2014-09-05 19:06:44