创建MySQL触发器的SQL语法错误

Ale*_*ndr 4 mysql database triggers innodb

我尝试创建触发器

CREATE TRIGGER `aster_users2` after
update ON `aster_users` FOR EACH ROW
BEGIN  update event set flag=1 where
id=1; END;
Run Code Online (Sandbox Code Playgroud)

但得到了下一个错误

错误1064(42000):您的SQL语法有错误; 检查与MySQL服务器版本对应的手册,以便在第6行的"结束"附近使用正确的语法

有建议解决这个问题吗?

p.c*_*ell 15

尝试从语句中删除分号.

如果你想保留你的分号,

DELIMITER $$
CREATE TRIGGER `aster_users2` after
update ON `aster_users` FOR EACH ROW
BEGIN  update event set flag=1 where
id=1;  
 END$$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

  • @bynu022 你并没有浪费你的时间,你实际上已经通过从错误中学习来投入了你的时间。 (2认同)

And*_*y M 5

您可以:

  • drop BEGINEND(仅在主体中只有一个语句时才有可能):

    CREATE TRIGGER `aster_users2` after
    update ON `aster_users` FOR EACH ROW
    update event set flag=1 where id=1;
    
    Run Code Online (Sandbox Code Playgroud)

    要么

  • 为整个CREATE TRIGGER语句添加DELIMITER说明符:

    DELIMITER |
    CREATE TRIGGER `aster_users2` after
    update ON `aster_users` FOR EACH ROW
    BEGIN
      update event set flag=1 where id=1;  
    END|
    DELIMITER ;
    
    Run Code Online (Sandbox Code Playgroud)

    注意第二个DELIMITER,它将恢复默认的语句定界符。

编辑 –说明:

通常,您使用;定界语句。但是,当涉及诸如的复合语句时CREATE TRIGGER,使用BEGIN/END并允许您在其主体中包含多个语句,解析器需要一种方法来区分主体语句与整个复合语句之后的分隔符之间的分隔符。

因此,您需要避免;在复合语句内部使用某种方式,或者告诉解析器该复合语句将使用其他定界符。如果您只是;@ p.campbell的建议之前END,也可以使用第一个选项。