2015-10-13 135 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 ;