2015-10-13 136 views
0

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

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; 

回答

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来引用当前记录来修改它。

+0

创建触发器后,任何更新失败: 无法更新存储的函数/触发器中的'mytable'表,因为它已被调用此存储的函数/触发器的语句使用。 – michael

+0

您不能在触发器中的同一张表上进行更新。这将创建一个无限循环。但是你可以使用'NEW'来引用当前记录来修改它。我更新了答案 –

+0

juergen,我已经使用你的更新答案,但现在续集亲告诉我:更新的新行不允许在触发后 – michael

1

你应该设置你的分隔符,以便触发内部的分号不会被解释为触发结束:

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