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;
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;
您需要更改分隔符,將觸發器設置爲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 ;
這裏是什麼地方錯了扳機:
1)SQL UPDATE
語句中觸發器的身體無效。 NEW.active
是對剛剛更新的行中的active
列的值的引用。這是來自行的值,而不是列的名稱。
2)即使修改了SQL語句來解決該問題,我們也不希望對同一行發出後續的UPDATE語句。 (在一些數據庫中,這是不允許的,我很驚訝,MySQL的允許它。)
3)這是一個AFTER UPDATE
觸發。我們認爲該觸發器的預期結果(即,在某一條件成立時將行中的列設置爲特定值)將在觸發器中更高效地實現。
下面是該active
列設置爲1,當任confirmed
或attend
列設置爲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 ;
MySQL允許它,並且觸發IF語句中的UPDATE語句的每個更新語句都將失敗。順便說一下,MySQL不會創建這個作爲AFTER UPDATE觸發器。 +1 – VMai 2014-09-05 17:58:58
@VMai:我同意(我認爲)。如果MySQL允許'AFTER UPDATE'觸發器在同一行的同一個表上發出'UPDATE',那麼UPDATE語句會觸發觸發器,然後執行另一個UPDATE觸發觸發器,廣告無窮。 (MySQL必須在某個地方拋出一個錯誤來防止這種情況發生)。是的,將'NEW.col'設置爲值需要在** BEFORE UPDATE **觸發器中執行,而不是AFTER UPDATE。 (我可能沒有在我的答案中說清楚) – spencer7593 2014-09-05 19:02:14
對於我來說,你的回答是清楚的,並處理了主要的兩個問題(包括重置DELIMITER):使用BEFORE UPDATE觸發器並使用簡單SET而不是更新可能導致確實產生錯誤消息(而不是無限循環)。對於BEFORE UPDATE觸發器中同一個表上的UPDATE,情況也是如此。 – VMai 2014-09-05 19:06:44
你真的需要更清楚地提出這樣的問題。這是否導致錯誤?如果是這樣,錯誤是什麼?還是它做了一些不同於你認爲會做的事情?如果是這樣,你期望它做什麼,而發生了什麼?也就是說,我認爲在定義觸發器時,問題的原因可能是您沒有使用DELIMITER,因爲對於大多數使用觸發器的人來說,這是一個混亂點。 – 2014-09-05 17:32:18