2011-04-28 110 views
3

我試圖創建觸發器錯誤的SQL語法創建MySQL的觸發

CREATE TRIGGER `aster_users2` after 
update ON `aster_users` FOR EACH ROW 
BEGIN update event set flag=1 where 
id=1; END; 

,但得到一個錯誤

ERROR 1064(42000):你在你的SQL語法錯誤;請檢查對應於您的MySQL服務器版本的手冊,以便在第6行'end'附近使用正確的語法。

有建議可以解決這個問題嗎?

回答

10

嘗試從您的語句中刪除分號。

如果你想保持你的分號,

DELIMITER $$ 
CREATE TRIGGER `aster_users2` after 
update ON `aster_users` FOR EACH ROW 
BEGIN update event set flag=1 where 
id=1; 
END$$ 
DELIMITER ; 
+0

謝謝你的回答 – Alexandr 2011-04-29 05:20:49

+0

我已經浪費了大約一小時。謝謝 – bynu022 2016-10-16 14:03:44

3

應使用分隔符。

DELIMITER $$ 

CREATE TRIGGER `aster_users2` AFTER 
UPDATE ON `aster_users` FOR EACH ROW 
BEGIN 
    UPDATE event 
    SET 
    flag = 1 
    WHERE 
    id = 1; 
END$$ 

DELIMITER ; 
+0

謝謝你的回答 – Alexandr 2011-04-29 05:21:25

4

您可以:

  • 下降BEGINEND(只能當有在體內的單個語句):

    CREATE TRIGGER `aster_users2` after 
    update ON `aster_users` FOR EACH ROW 
    update event set flag=1 where id=1; 
    

  • 添加分隔符符整個CREATE TRIGGER聲明:

    DELIMITER | 
    CREATE TRIGGER `aster_users2` after 
    update ON `aster_users` FOR EACH ROW 
    BEGIN 
        update event set flag=1 where id=1; 
    END| 
    DELIMITER ; 
    

    注二等DELIMITER,其還原默認的語句分隔符。

編輯 - 說明:

通常使用的是;界定語句。但是,對於使用BEGIN/END並允許在其主體中包含多個語句的CREATE TRIGGER等複合語句時,解析器需要一種方法來在整個複合語句之後區分主體語句與分隔符之間的分隔符。

因此,您需要以某種方式避免在複合語句中使用;,或者告訴解析器複合語句將使用不同的分隔符。如果您在END之前剛剛落下;,也可以實現第一個選項,如@p.campbell已提示。

+0

第一個變體在這裏適用。 – Devart 2011-04-28 10:16:51

+0

感謝您的回答 – Alexandr 2011-04-29 05:19:57