2011-04-28 108 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