Я не знаю, что вы определили для типа данных reservation.sent_time
, но я заметил, что вы помещаете функцию NOW()
в кавычки, превращая ее в буквальную строку 'NOW()'
вместо вызова функциичтобы получить текущее время.
Хорошо, вот еще две проблемы:
Во-первых, оператор IF
в языке триггера MySQL требует END IF;
после блока.
Во-вторых, вы используете DELIMITER
?Например:
DELIMITER //
CREATE TRIGGER reservation_auto_reply
AFTER INSERT ON reservation
FOR EACH ROW
BEGIN
IF NEW.sent_type = 1 /* In-App */
THEN
INSERT INTO `messagehistory` (`trip`, `fk`, `sent_time`, `status`, `message_type`, `message`)
VALUES (NEW.trip, NEW.psk, NOW(), 'submitted', 4, 'This is an automated reply to reservation');
END IF;
END//
DELIMITER ;
Это необходимо, поскольку клиент mysql позволяет запускать несколько операторов в интерактивном режиме или в сценарии SQL.Но это как-то глупо - он обрабатывает ввод как один оператор SQL, пока не достигнет терминатора оператора.Обычно терминатором является точка с запятой (;
).
Но в вашем триггерном теле есть буквальная точка с запятой!Если клиент mysql останавливается на первой точке с запятой, он попытается определить ваш триггер с помощью неполного оператора.
Решение в клиенте mysql состоит в том, чтобы временно изменить терминатор оператора на другой символ или последовательность символов не появляется в вашем теле триггера.Например: //
.
(Обратите внимание, что команда DELIMITER
является встроенным клиентом mysql. Она не распознается, если вы выполняете динамические операторы SQL из своего приложения.)