2015-10-13 4 views
0

Я хочу обновить два столбца после обновления текущей строки триггером. Конечное время и время запуска - это тип даты. длительность целая, и она будет представлять собой несколько секунд. Sequel Pro сообщит мне «[ОШИБКА в запросе 1] У вас есть ошибка в синтаксисе SQL, проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '' по строке 5 Выполнение остановлено!"My sql trigger, синтаксическая ошибка

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

Вы должны изменить разделитель. В противном случае 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 ; 

Вы не можете поставить обновление на том же столе в триггере. Это создало бы бесконечный цикл. Но вы можете использовать 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 ; 
Смежные вопросы