2012-02-10 149 views
0

使用InnoDB在MySQL 5.5.9上運行。MySQL觸發語法錯誤

我創建了以下觸發:

CREATE TRIGGER TRIGGER_Products_Insert 
AFTER INSERT ON Products 

FOR EACH ROW 
BEGIN 
UPDATE Products 
SET current = 0 
WHERE id = new.id 
    AND current = 1 
    AND autonumber <> new.autonumber 
END; 

MySQLWorkbench顯示在最後一行語法錯誤,並執行,這將引發以下錯誤

錯誤代碼:1064你有一個錯誤你的SQL語法;請檢查與您的MySQL服務器版本對應的手冊,以便在第11行'END'附近使用正確的語法。

我的錯誤在哪裏?

回答

2

http://dev.mysql.com/doc/refman/5.5/en/create-trigger.html

DELIMITER | 

CREATE TRIGGER TRIGGER_Products_Insert AFTER INSERT ON Products 
    FOR EACH ROW BEGIN 
     UPDATE Products 
     SET current = 0 
     WHERE id = new.id 
      AND current = 1 
      AND autonumber <> new.autonumber; 
    END; 
| 

DELIMITER ; 
+0

這個工作,但我不知道爲什麼'DELIMITER'的東西是必要的。 – 2012-02-10 11:31:03

+1

因爲'BEGIN ... END'是觸發器的「主體」。所以,它必須是當前查詢的一部分。 ';'默認情況下是一個分隔符,所以當MySQL到達它時,它認爲這是查詢的結束並且不能解析它。此外,您必須將定界符放在觸發器的「正文」中,因爲它會以其他方式失效。所以,爲了滿足這個要求,我們需要在觸發器的「主體」中使用兩個不同的定界符,並在查詢中使用它自己。對不起,我的英文太難描述這個不太明顯的東西了... – Timur 2012-02-10 11:37:53

+0

這裏比較好描述:http://dev.mysql.com/doc/refman/5.5/en/begin-end.html(第三段,以「使用多個語句要求客戶端能夠」開頭) – Timur 2012-02-10 11:42:39

0

你是你END關鍵字之前缺少;

CREATE TRIGGER TRIGGER_Products_Insert 
AFTER INSERT ON Products 

FOR EACH ROW 
BEGIN 
UPDATE Products 
SET current = 0 
WHERE id = new.id 
    AND current = 1 
    AND autonumber <> new.autonumber; 
END; 
+0

不工作,使雙方的最後現在的倒數第二行的錯誤。 – 2012-02-10 11:29:04