Mysql create trigger syntax error

Running on MySQL 5.5.9 with InnoDB. I created the following trigger: CREATE TRIGGER TRIGGER_Products_Insert AFTER INSERT ON Products FOR EACH ROW BEGIN UPDATE Products SET current = 0 WHERE id...

Running on MySQL 5.5.9 with InnoDB.

I created the following trigger:

CREATE TRIGGER TRIGGER_Products_Insert
AFTER INSERT ON Products

FOR EACH ROW
BEGIN
UPDATE Products
SET current = 0
WHERE   id = new.id
    AND current = 1
    AND autonumber <> new.autonumber
END;

MySQLWorkbench shows a syntax error on the last line, and executing this throws the following error

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘END’ at line 11

Where is my error?

asked Feb 10, 2012 at 11:15

Jan Jongboom's user avatar

Jan JongboomJan Jongboom

26.3k9 gold badges82 silver badges120 bronze badges

http://dev.mysql.com/doc/refman/5.5/en/create-trigger.html

DELIMITER |

CREATE TRIGGER TRIGGER_Products_Insert AFTER INSERT ON Products
    FOR EACH ROW BEGIN
        UPDATE Products
        SET current = 0
        WHERE   id = new.id
            AND current = 1
            AND autonumber <> new.autonumber;
    END;
|

DELIMITER ;

Stefan Falk's user avatar

Stefan Falk

23k46 gold badges181 silver badges355 bronze badges

answered Feb 10, 2012 at 11:23

Timur's user avatar

3

You are missing a ; before your END keyword:

CREATE TRIGGER TRIGGER_Products_Insert
AFTER INSERT ON Products

FOR EACH ROW
BEGIN
UPDATE Products
SET current = 0
WHERE   id = new.id
    AND current = 1
    AND autonumber <> new.autonumber;
END;

answered Feb 10, 2012 at 11:18

juergen d's user avatar

juergen djuergen d

200k36 gold badges286 silver badges350 bronze badges

1

Почему не работает полностью скопированный триггер mysql,уже до дыр его рассмотрел. Все база существуют с такими полями.

mysql>
mysql>  USE  statistic;  CREATE TRIGGER`countryLog` AFTER INSERT ON `Country` FOR EACH ROW BEGIN INSERT INTO log(msg,row_id) values ('insert', NEW.id_country); END;
Database changed
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END' at line 1
mysql>


  • Вопрос задан

    более трёх лет назад

  • 460 просмотров

Потому что здесь вы, наоборот, не изменили delimiter команд, что требуется сделать.
Такой вот дурацкий синтаксис mysql, парсеру надо специально объяснять, где заканчивается триггер (или хранимая процедура).

Пригласить эксперта

CREATE TRIGGER `countryLog` AFTER INSERT ON `Country`
 FOR EACH ROW INSERT INTO log(`msg`, `row_id`) VALUES ('insert', NEW.id_country)

Потому что тут:

USE  statistic;  CREATE TRIGGER`countryLog` AFTER INSERT ON `Country` FOR EACH ROW BEGIN INSERT INTO log(msg,row_id) values ('insert', NEW.id_country); END;

три запроса (последний — END;).


  • Показать ещё
    Загружается…

09 февр. 2023, в 13:28

777 руб./за проект

12 февр. 2023, в 21:32

80000 руб./за проект

12 февр. 2023, в 21:30

2900 руб./за проект

Минуточку внимания

  • #1

Не создаётся триггер (MySQL 5.0.51a-3ubuntu5.1)

Код:

CREATE TRIGGER `artists_litera_autoupdate` after update ON `cms_artists`
   FOR EACH ROW BEGIN
      UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = OLD.id;
   END;

CREATE TRIGGER `artists_litera_autoinsert` after insert ON `cms_artists`
   FOR EACH ROW BEGIN
      UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = NEW.id;
   END;

Текст ошибки:

#1064 — You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near » at line 3

Подскажите, пожалуйста, что я делаю не так? Или хотя бы объясните о какой ошибке говорит MySQL сервер? Ответ просто до безобразия избыточен :)

UPD: забыл сказать, что в интернетах вычитал, что для создания триггеров в MySQL < 5.1.6 необходимо быть супер-пользователем. На локальному компе стоит 5.0.45, из под рута пробовал создавать эти триггеры, результат тот же (та же ошибка в ответе).

Dl

Dl

Новичок


  • #2

А если разделитель сменить?

  • #3

Уже пытался.

Запрос:

Код:

DELIMITER |
   CREATE TRIGGER `artists_litera_autoupdate` after update ON `cms_artists`
      FOR EACH ROW BEGIN
         UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = OLD.id;
      END;
|

Ответ:

#1064 — You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘DELIMITER |
CREATE TRIGGER `artists_litera_autoupdate` after update ON `cms_’ at line 1

Dl

Dl

Новичок


  • #4

То есть в командной строке ругается на DELIMITER |
?

Dl

Dl

Новичок


  • #6

Ну не знаю, как через phpmyadmin, но такие варианты работают:

PHP:

$query = 'CREATE TRIGGER `artists_litera_autoupdate` after update ON `cms_artists`
   FOR EACH ROW BEGIN
      UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = OLD.id;
   END;';
$mysqli->query($query);

$query = 'CREATE TRIGGER `artists_litera_autoinsert` after insert ON `cms_artists`
   FOR EACH ROW BEGIN
      UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = NEW.id;
   END;';
$mysqli->query($query);

$query = 'CREATE TRIGGER `artists_litera_autoupdate` after update ON `cms_artists`
   FOR EACH ROW BEGIN
      UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = OLD.id;
   END;

CREATE TRIGGER `artists_litera_autoinsert` after insert ON `cms_artists`
   FOR EACH ROW BEGIN
      UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = NEW.id;
   END;';
$mysqli->multi_query($query);

  • #7

через phpMyAdmin вряд ли такое получится… он не любит все эти процедуры, триггеры и т.д…

  • #8

Окей, исполнил запросы через консоль.

Вопрос — как можно триггеры создавать без рутовских полномочий?

  • #9

для mysql-5.0 никак похоже. как-то даже пришлось отказаться от триггеров

  • #10

так правильней
[sql]
CREATE TRIGGER `artists_litera_autoupdate` BEFORE update ON `cms_artists` or BEFORE INSERT ON `cms_artists`
FOR EACH ROW
SET NEW.`litera` = substring(NEW.name, 0, 1);
[/sql]

  • #11

Ребята, большое спасибо за дискуссию!

-~{}~ 04.06.09 21:01:

ан нет, не прошёл предложенный prolis’ом запрос :(

Код:

mysql> CREATE TRIGGER `artists_litera_autoupdate` BEFORE UPDATE ON `cms_artists` OR BEFORE INSERT ON `cms_artists`
    -> FOR EACH
    -> ROW
    -> SET NEW.`litera` = substring(NEW.name, 0, 1 ) ;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near
'OR BEFORE INSERT ON `cms_artists`
FOR EACH
ROW
SET NEW.`litera` = substring(NEW.' at line 1

что не так?

-~{}~ 04.06.09 21:07:

Блин, даже если два триггера создавать то запрос проходит как бы успешно, но на самом деле ничего не меняет в `information_schema`.`TRIGGERS` пустота :(

Код:

mysql>  DELIMITER $$
mysql> CREATE TRIGGER `artists_litera_autoupdate` after update ON `cms_artists`
    -> FOR EACH ROW BEGIN
    ->    UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = OLD.id;
    -> END;
    ->
    -> CREATE TRIGGER `artists_litera_autoinsert` after insert ON `cms_artists`
    -> FOR EACH ROW BEGIN
    ->    UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = NEW.id;
    -> END;
    -> $$
Query OK, 0 rows affected (0.06 sec)

Query OK, 0 rows affected (0.06 sec)

-~{}~ 04.06.09 21:11:

Хотя если потом исполнить для одного триггера отдельно (artists_litera_autoupdate) то MySQL отвечает:

ERROR 1235 (42000): This version of MySQL doesn’t yet support ‘multiple triggers with the same action time and event for one table’

т.е. триггер таки есть, но он не отрабатывает нужным образом и отсутствует в information_schema!

-~{}~ 04.06.09 21:17:

Так это ещё и не всё! :)

Код:

INSERT INTO `klipz`.`cms_artists` (`name`) VALUES ('yabidabidudududu')

Ответ MySQL:

#1442 — Can’t update table ‘cms_artists’ in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

-~{}~ 04.06.09 22:47:

Удалил триггеры, добавил только для обновления. Чето нифига не изменяется содержимое поля litera после обновления

-~{}~ 04.06.09 22:50:

Всё равно не понимаю. Триггер вроде бы успешно создался, при show triggers он показывается а в information_schema его нет. А вроде как должен быть. Ведь так?
[q]mysql> CREATE TRIGGER `artists_litera_autoupdate` AFTER UPDATE ON `cms_artists`
-> FOR EACH ROW BEGIN
-> UPDATE `cms_artists` SET `litera` = substring(NEW.`name`, 0, 1) WHERE `id` = NEW.`id`;
-> END;
-> $$
Query OK, 0 rows affected (0.01 sec)

mysql> show triggers$$
+—————+———+————-+———————+———+———+———-+—————-+
| Trigger | Event | Table | Statement | Timing |Created| sql_mode | Definer |
+—————+———+————-+———————+———+———+———-+—————-+
| artists_litera_autoupdate | UPDATE | cms_artists | BEGIN
UPDATE `cms_artists` SET `litera` = substring(NEW.`name`, 0, 1) WHERE `id` = NEW.`id`;
END | AFTER | NULL | | [email protected] |
+—————+———+————-+———————+———+———+———-+—————-+
1 row in set (0.00 sec)

[/q]

Код:

SELECT *
FROM `TRIGGERS`
LIMIT 0 , 30

[q]MySQL returned an empty result set (i.e. zero rows). ( Query took 0.0185 sec )[/q]

Dl

Dl

Новичок


  • #12

не прошёл предложенный prolis’ом запрос

И не должен

даже если два триггера создавать то запрос проходит как бы успешно

Это похоже больше на шаманство, чем на осмысленные действия. Почему между END; и CREATE нету $$ ?

#1442 — Can’t update table ‘cms_artists’ in stored function/trigger because it is already used by statement which invoked this stored function/trigger

http://dev.mysql.com/doc/refman/5.0/en/stored-program-restrictions.html

Within a stored function or trigger, it is not permitted to modify a table that is already being used (for reading or writing) by the statement that invoked the function or trigger

  • #13

Клааааааааасссс!

Я целый день впустую потратил. Г..споди, какой кошмар :( дурак блин, мануалы читать надо было сначала.

Итак, тогда переформулирую вопрос: мне необходимо каким-то образом иметь в базе данных актуальную информацию в виде поле `litera` типа char, которое будет содержать первый символ поля `name`, типа varchar. Решил что триггеры идеально подойдут для моего случая.

Есть ли какой-нибудь другой способ реализовать задуманное мной средствами MySQL?

Dl

Dl

Новичок


  • #14

Ну если принципиально триггером, то вот так:
set new.`litera`=substring(new.`name`, 1, 1)

  • #15

так ничего не изменилось-то, так же не даёт ничего сделать. черт, целый день зря потратил. сеня с утра в скрипты заложил етот функционал..

Dl

Dl

Новичок


  • #16

так ничего не изменилось-то, так же не даёт ничего сделать

Информативно :)

  • #17

Создавал такой триггер:

Код:

CREATE TRIGGER `artists_litera_autoupdate` after update ON `cms_artists`
   FOR EACH ROW BEGIN
      UPDATE `cms_artists` set new.`litera`=substring(new.`name`, 1, 1) WHERE `id` = NEW.`id`;
   END;

и затем, при апдейте вываливалось таже самая ошибка:

#1442 — Can’t update table ‘cms_artists’ in stored function/trigger because it is already used by statement which invoked this stored function/trigger

Если я правильно понял цитату с mysql.com выше, то получается, что в моём случае, триггеры использовать невомзожно.

Dl

Dl

Новичок


  • #18

set new.`litera`=substring(new.`name`, 1, 1)

Я про update не упомянул ни слова, это все содержимое begin … end

  • #19

Уже смешно, честно :)

Код:

mysql> delimiter $$
mysql> CREATE TRIGGER `artists_litera_autoupdate` after update ON `cms_artists`
    ->  FOR EACH ROW BEGIN
    ->     set new.`litera`=substring(new.`name`, 1, 1);
    ->  END;
    -> $$
ERROR 1362 (HY000): Updating of NEW row is not allowed in after trigger

:D

Dl

Dl

Новичок


Like this post? Please share to your friends:
  • Mysql clear error log
  • Myriwell 3d ручка error
  • Myisamchk error 140 when opening myisam table
  • Myheritage произошла ошибка пожалуйста попытайтесь еще раз позже
  • My friend pedro blood bullets bananas has encountered an error and must close