【问题标题】:My sql trigger, syntax errorMysql触发器,语法错误
【发布时间】:2015-10-13 09:12:14
【问题描述】:

我想在当前行更新后通过触发器更新两列。 endtime 和 starttime 是日期时间类型。持续时间是整数,它将代表秒数。 Sequel Pro 告诉我“[查询 1 中的错误] 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 5 行的 '' 附近使用 执行停止!”

CREATE TRIGGER `end_time_update` AFTER UPDATE ON `mytable` 
FOR EACH ROW
BEGIN
UPDATE mytable
set endtime = now(), duration = TIMESTAMPDIFF(SECOND, starttime, endtime)
where id = new.id;
END;

【问题讨论】:

    标签: mysql sql triggers syntax-error


    【解决方案1】:

    您需要更改分隔符。否则数据库将在第一个;终止触发器的定义

    delimiter |
    CREATE TRIGGER `end_time_update` BEFORE UPDATE ON `mytable` 
    FOR EACH ROW
    BEGIN
       if NEW.some_col <> OLD.some_col
       then
          set NEW.endtime = now();
          set NEW.duration = TIMESTAMPDIFF(SECOND, NEW.starttime, NEW.endtime);
       end if;
    END
    |
    delimiter ;
    

    您不能对触发器中的同一个表进行更新。那将创建一个无限循环。但是你可以使用NEW引用当前记录来修改它。

    【讨论】:

    • 创建触发器后,任何更新都失败:无法更新存储函数/触发器中的表“mytable”,因为它已被调用此存储函数/触发器的语句使用。
    • 您不能对触发器中的同一个表进行更新。那将创建一个无限循环。但是你可以使用NEW引用当前记录来修改它。我更新了答案
    • juergen,我已经使用了您的更新答案,但现在续集亲告诉我:触发器后不允许更新新行
    • 然后用BEFORE UPDATE ON mytable代替AFTER UPDATE ON mytable
    • 您好,如果我只想在指定列发生变化时更新,该怎么做?
    【解决方案2】:

    您应该设置分隔符,以便触发器内的分号不会被解释为触发器的结尾:

    -- Set the delimiter
    DELIMITER $$
    
    CREATE TRIGGER `end_time_update` AFTER UPDATE ON `mytable` 
    FOR EACH ROW
    BEGIN
    UPDATE mytable
    set endtime = now(), duration = TIMESTAMPDIFF(SECOND, starttime, endtime)
    where id = new.id;
    END;
    $$
    
    -- Reset the delimiter
    DELIMITER ;
    

    【讨论】:

      猜你喜欢
      • 2015-08-09
      • 2015-06-02
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      相关资源
      最近更新 更多