【问题标题】:error in your SQL syntax creating MySQL trigger创建 MySQL 触发器的 SQL 语法错误
【发布时间】:2011-04-28 05:45:27
【问题描述】:

我尝试创建触发器

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

有解决这个问题的建议吗?

【问题讨论】:

    标签: mysql database triggers innodb


    【解决方案1】:

    您可以:

    • 删除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,它恢复了默认的语句分隔符。

    编辑 – 解释:

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

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

    【讨论】:

    • 第一个变体在这里是合适的。
    • 比起公认的答案,我更喜欢这个答案,因为它解释了 MySQL 设计的这个不合逻辑的陷阱。
    【解决方案2】:

    应该使用分隔符。

    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】:

      尝试从语句中删除分号。

      如果您想保留分号,

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

      【讨论】:

      • 我已经浪费了大约一个小时。谢谢
      • @bynu022 你并没有浪费你的时间,你实际上是通过从错误中吸取教训来投入你的时间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2020-10-17
      相关资源
      最近更新 更多