ошибка в вашем синтаксисе SQL при создании триггера MySQL - PullRequest
4 голосов
/ 28 апреля 2011

Я пытаюсь создать триггер

CREATE TRIGGER `aster_users2` after
update ON `aster_users` FOR EACH ROW
BEGIN  update event set flag=1 where
id=1; END;

, но получил следующую ошибку

ОШИБКА 1064 (42000): в синтаксисе SQL имеется ошибка;обратитесь к руководству, соответствующему вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования в конце строки в строке 6

. Предложите решение этой проблемы?

Ответы [ 3 ]

14 голосов
/ 28 апреля 2011

Попробуйте удалить точки с запятой из ваших утверждений.

Если вы хотите сохранить свои точки с запятой,

DELIMITER $$
CREATE TRIGGER `aster_users2` after
update ON `aster_users` FOR EACH ROW
BEGIN  update event set flag=1 where
id=1;  
 END$$
DELIMITER ;
5 голосов
/ 28 апреля 2011

Вы можете либо:

  • drop BEGIN и END (возможно только при наличии одного оператора в теле):

    CREATE TRIGGER `aster_users2` after
    update ON `aster_users` FOR EACH ROW
    update event set flag=1 where id=1;
    

    или

  • добавить спецификатор DELIMITER для всего оператора CREATE TRIGGER:

    DELIMITER |
    CREATE TRIGGER `aster_users2` after
    update ON `aster_users` FOR EACH ROW
    BEGIN
      update event set flag=1 where id=1;  
    END|
    DELIMITER ;
    

    Обратите внимание на второй DELIMITER, который восстанавливает разделитель оператора по умолчанию.

EDIT - Объяснение:

Как правило, вы используете ; для разделения операторов.Но когда дело доходит до составных операторов, таких как CREATE TRIGGER, которые используют BEGIN/END и позволяют включать в свои тела несколько операторов, синтаксическому анализатору необходим способ отличить разделители между операторами тела от разделителя после всего составного оператора.

Таким образом, вам нужно либо как-то воздержаться от использования ; внутри составного оператора, либо сообщить парсеру, что составной оператор будет использовать другой разделитель.Первый вариант также может быть достигнут, если вы просто уроните ; до END, как предложено @p.campbell.

3 голосов
/ 28 апреля 2011

Следует использовать разделители.

DELIMITER $$

CREATE TRIGGER `aster_users2` AFTER
UPDATE ON `aster_users` FOR EACH ROW
BEGIN
  UPDATE event
  SET
    flag = 1
  WHERE
    id = 1;
END$$

DELIMITER ;
...