首页 文章

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

提问于
浏览
4

我尝试创建触发器

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行的“结束”附近使用正确的语法

有建议解决这个问题吗?

3 回答

  • 4

    尝试从语句中删除分号 .

    如果你想保留你的分号,

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

    你可以:

    • drop BEGINEND (仅当正文中有单个语句时才可以):
    CREATE TRIGGER `aster_users2` after
    update ON `aster_users` FOR EACH ROW
    update event set flag=1 where id=1;
    

    要么

    • 为整个 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 ;
    

    注意第二个 DELIMITER ,它恢复默认语句分隔符 .

    EDIT - 说明:

    通常,您使用 ; 来分隔语句 . 但是当涉及像 CREATE TRIGGER 这样的复合语句,它们使用 BEGIN/END 并允许你在它们的主体中包含多个语句时,解析器需要一种方法来区分整个复合语句之后正文语句与分隔符之间的分隔符 .

    因此,您需要以某种方式避免在复合语句中使用 ; 或告诉解析器复合语句将使用不同的分隔符 . 如果您在 END 之前删除 ; ,也可以实现第一个选项,如@p.campbell建议的那样 .

  • 13

    应该使用分隔符 .

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

相关问题