MySQL Ошибка 1064. При создании триггера. Помогите пожалуйста. Ругается на точку с запятой абсолютно в любом месте
CREATE TRIGGER before_bike_insert
BEFORE
INSERT ON bike FOR EACH ROW
BEGIN
IF NEW.speed < 700 THEN INSERT INTO bike (bike_id, type, brand, status_, speed)
VALUES (NEW.bike_id,
NEW.type,
NEW.brand,
NEW.status_,
NEW.speed);
END IF;
END;
Ответы (1 шт):
Автор решения: Akina
→ Ссылка
- Триггер - разновидность compound statement (т.е. он состоит из нескольких запросов). В коде создания присутствует несколько символов
;, которые завершают не сам код создания триггера, а отдельные входящие в его тело запросы. Но сервер не может различить, какое назначение у каждого конкретного символа. Для различения на время создания следует переопределить символ, завершающий команду создания. В CLI и некоторых других клиентах это делает командаDELIMITER {новый разделитель}(обратите внимание - разделитель может состоять из нескольких символов, например, замена стандартного;на;;достаточно безопасна). Соответственно надо установить новый разделитель до создания, использовать его при создании триггера, и затем вернуть как было (установить стандартный разделитель):
DELIMITER ;; -- установить новый разделитель
CREATE TRIGGER ...
BEGIN
... ; -- здесь ; не является разделителем при создании триггера
... ; -- однако он будет разделителем в момент выполнения триггера
... ;
END ;; -- использовать новый разделитель для завершения команды создания
DELIMITER ; -- восстановить стандартный разделитель
- Изменение другой таблицы в триггере имеет смысл только после того, как изменение основной таблицы выполнено успешно - тогда при сбое основного запроса не придётся откатывать изменения, внесённые триггером. Меньше работы серверу.
- Данный конкретный триггер может быть преобразован в код, содержащий в теле только один statement, если использовать INSERT .. SELECT. При этом не требуется BEGIN-END и переопределение DELIMITER, потому что весь код создания триггера станет одним запросом.
CREATE TRIGGER after_bike_insert
AFTER INSERT ON bike
FOR EACH ROW
INSERT INTO bike (bike_id, type, brand, status_, speed)
SELECT NEW.bike_id, NEW.type, NEW.brand, NEW.status_, NEW.speed
WHERE NEW.speed < 700;
