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
  1. Триггер - разновидность compound statement (т.е. он состоит из нескольких запросов). В коде создания присутствует несколько символов ;, которые завершают не сам код создания триггера, а отдельные входящие в его тело запросы. Но сервер не может различить, какое назначение у каждого конкретного символа. Для различения на время создания следует переопределить символ, завершающий команду создания. В CLI и некоторых других клиентах это делает команда DELIMITER {новый разделитель} (обратите внимание - разделитель может состоять из нескольких символов, например, замена стандартного ; на ;; достаточно безопасна). Соответственно надо установить новый разделитель до создания, использовать его при создании триггера, и затем вернуть как было (установить стандартный разделитель):
DELIMITER ;;    -- установить новый разделитель
CREATE TRIGGER ...
BEGIN
    ... ;       -- здесь ; не является разделителем при создании триггера
    ... ;       -- однако он будет разделителем в момент выполнения триггера
    ... ;
END ;;          -- использовать новый разделитель для завершения команды создания
DELIMITER ;     -- восстановить стандартный разделитель
  1. Изменение другой таблицы в триггере имеет смысл только после того, как изменение основной таблицы выполнено успешно - тогда при сбое основного запроса не придётся откатывать изменения, внесённые триггером. Меньше работы серверу.
  2. Данный конкретный триггер может быть преобразован в код, содержащий в теле только один 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;
→ Ссылка