SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 15.07.2011 21:01:42

uNsLide
Участник
Зарегистрирован: 17.06.2010
Сообщений: 13

триггеры на поля с autoincrement и timestamp

Добрый вечер.
Задача такая - 2 триггера: after insert и after update

при добавлении записи не нужно указывать id - он должен генерироваться автоматически в БД
при добавлении записи не нужно указывать mod_date - это поле должно заполняться триггером

Структура БД:

create table `abonent` (
`id` int(11) not null auto_increment,
`emp_num` int(11) unique not null,
`name` varchar(50) not null default 'нет данных',
`dept` varchar(20) not null default 'нет данных',
`position` varchar(100) not null default 'нет данных',
`phone` varchar(11) not null default '00-00',
`email` varchar(50) unique not null,
`mod_date` timestamp NOT NULL default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
primary key(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;


Триггеры:
- After Insert
delimiter $$
CREATE TRIGGER `ai_mod_date` AFTER Insert ON `abonent`
FOR EACH ROW
BEGIN
INSERT into `abonent` (`emp_num`, `name`, `dept`, `position`, `phone`, `email`) VALUES
(NEW.emp_num, NEW.name, New.dept, New.position, New.phone, New.email);
END$$
delimiter ;

- After Update
delimiter $$
CREATE TRIGGER `au_mod_date` AFTER update ON `abonent`
FOR EACH ROW
BEGIN
INSERT into `abonent`
set mod_date= New.mod_date;
END$$
delimiter ;


В обоих случаях выдается ошибка: #1442 - Can't update table 'abonent' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Вопрос - почему ошибка происходит? И правильно ли написан триггер?
Заранее благодарю за ответ.

Неактивен

 

#2 15.07.2011 21:17:00

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

Re: триггеры на поля с autoincrement и timestamp

Внутри триггера запрещены запросы на обновление той де таблицы, к которой привязан триггер. Вашу задачу нужно решать иначе - триггерами before insert и before update, изменяя значение new.id на NULL

SET new.id=NULL, new.mod_date=NULL;

Неактивен

 

#3 15.07.2011 21:45:04

uNsLide
Участник
Зарегистрирован: 17.06.2010
Сообщений: 13

Re: триггеры на поля с autoincrement и timestamp

rgbeast написал:

Внутри триггера запрещены запросы на обновление той де таблицы, к которой привязан триггер. Вашу задачу нужно решать иначе - триггерами before insert и before update, изменяя значение new.id на NULL

SET new.id=NULL, new.mod_date=NULL;

А если крайне важно использовать событие именно After в обоих случаях, то что нужно поменять в коде, чтобы все отрабатывало успешно?

Я руководствовался примером их этой ссылки - Пример, раздел - The Pretty Easy Trigger: Logging and Auditing, и там срабатывает запрос внутри триггера...

Отредактированно uNsLide (15.07.2011 21:49:53)

Неактивен

 

#4 15.07.2011 22:10:03

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

Re: триггеры на поля с autoincrement и timestamp

В примере по ссылке запрос обращается к другой таблице, а не к той же самой. Запрет очень легко понять - ваш триггер AFTER INSERT делает еще одну вставку в ту же таблицу, то есть должен снова вызвать триггер AFTER INSERT (себя же). Если такое поведение разрешить, рекурсия будет бесконечной.

Триггеры AFTER уже не могут изменить вставляемые данные, так как вызываются после завершения вставки. Что бы вы ни делали в триггере, строка уже вставлена в таблицу.

Неактивен

 

Board footer

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