SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 07.08.2013 15:29:54

skolozhabskiy
Участник
Зарегистрирован: 14.08.2011
Сообщений: 24

MySql триггер. Ошибка при обработке запроса

добрый день,

в предыдущей моей теме разбирался вопрос о переносе на удаленный сервер с помощью импорта через phpmyadmin таблицы с двумя полями, имеющими свойства TIMESTAMP и значениями по умолчанию CURRENT_TIMESTAMP. Оптимальным было найдено решение для таблицы `products`:

`date_added` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'когда добавлен товар',
`timeLeft` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'для обратного отсчета времени для countdown_time',

но в этом случае в поле `timeLeft` год будет 1970 или 1900.

для того, чтобы записывать в него текущую дату и время необходимо создать триггер, например такой:

DELIMITER |
CREATE TRIGGER `update_time` before update ON `products`
BEGIN
   NEW.timeLeft = NEW.date_added;
END
DELIMITER ;

На вкладке "Триггеры" таблицы `products` я добавил триггер следующим образом:

1. открыл таблицу `products`
2. открыл вкладку Триггеры
3. Добавить триггер -> открылась форма, заполнил поля

название - update_time
таблица - products
время - BEFORE
событие - UPDATE
определение :

BEGIN
NEW.timeLeft = NEW.date_added;
END

определитель - оставил пустым

4. нажал кнопку OK

но при его добавлении на вкладке "Триггеры" таблицы `products` возникло сообщение об ошибке:

При обработке вашего запроса были обнаружены ошибки:
Данный запрос не был выполнен: "CREATE TRIGGER `update_time` BEFORE UPDATE ON `products` FOR EACH ROW BEGIN NEW.timeLeft = NEW.date_added; END"

Ответ MySQL: #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 '.timeLeft = NEW.date_added; END' at line 2

в чем проблема и как исправить ошибку?

и еще вопрос : могу ли я редактировать таблицу `products` с таким триггером, если например, у клиента открыт магазин или у меня открыта адмипанель? или редактирование таблицы будет все время выдавать сообщения об ошибках?

спасибо за помощь

Отредактированно skolozhabskiy (07.08.2013 15:31:50)

Неактивен

 

#2 07.08.2013 18:03:19

skolozhabskiy
Участник
Зарегистрирован: 14.08.2011
Сообщений: 24

Re: MySql триггер. Ошибка при обработке запроса

проблема решена так:

BEGIN
SET NEW.timeLeft = NEW.date_added;
END

но возник вопрос - нужен ли вообще триггер для поля, значение которого устанавливается программно. для примера, нужно установить, что акция* "при покупке товара получаете акционный подарок" завершится через 30 дней. в поле `timeLeft` дата и время устанавливаются на 30 дней вперед и затем программно на странице отображается обратный отсчет времени пока текущая дата не станет равной `timeLeft`.

может при такой задаче следует прописать поля в таблице `products` так :

`date_added` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'когда добавлен товар',
`timeLeft` TIMESTAMP NOT NULL COMMENT 'для обратного отсчета времени для countdown_time', - без значения по умолчанию

* акция выборочная для ряда продуктов, например с id равными 2010, 2011,2045,2078-3001,3056 и так далее

или есть более оптимальные решения

спасибо за помощь

Неактивен

 

#3 09.08.2013 02:58:20

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: MySql триггер. Ошибка при обработке запроса

С триггером нужно иметь в виду, что он будет срабатывать при любом апдейте и данное поле невозможно будет установить в какое-то иное значение. Если поле обрабатывается в программе, то триггер не нужен.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson