我的 sql 触发器,语法错误

My sql trigger, syntax error

我想在触发器更新当前行后更新两列。 endtime 和 starttime 是 datetime 类型。持续时间是整数,它将代表秒数。 Sequel 专家告诉我“[查询 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;

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

-- 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 ;

您需要更改分隔符。否则 DB 将在第一个 ;

处终止触发器的定义
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 ;

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