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 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
23k46 gold badges181 silver badges355 bronze badges
answered Feb 10, 2012 at 11:23
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 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
Новичок
-
#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
Новичок
-
#4
То есть в командной строке ругается на DELIMITER |
?
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
Новичок
-
#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
Новичок
-
#14
Ну если принципиально триггером, то вот так:
set new.`litera`=substring(new.`name`, 1, 1)
-
#15
так ничего не изменилось-то, так же не даёт ничего сделать. черт, целый день зря потратил. сеня с утра в скрипты заложил етот функционал..
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
Новичок
-
#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
Dl
Новичок