MySQL при вставки строки #1442 - Can't update …

Рейтинг: 0Ответов: 2Опубликовано: 04.05.2015

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

CREATE DEFINER = `root`@`localhost` TRIGGER `NewRecord` AFTER INSERT ON `operator` 
FOR EACH
ROW BEGIN 
UPDATE `operator` SET `Export` =1;
END

Так при добавлении записи в таблицу, валится ошибка: «#1442 - Can't update table 'operator' in stored function/trigger because it is already used by statement which invoked this stored function/trigger»
Решение которой описывается в «статье» Но у меня как-то не получается с ней справиться.

Разъясните пожалуйста, где собака зарыта …
Заранее спасибо

P.S.
Client API version: mysqlnd 5.0.10 - 20111026 - $Id: e707c415db32080b3752b232487a435ee0372157 $

Ответы

▲ 1Принят

Все верно. Если вы уже вставили запись, то логично, что менять уже что-то поздно. Триггер после записи обычно нужен для изменения (расчета) каких-то данных в других таблицах: в статье приведен пример, где по добавлению лайка в таблицу лайков меняется общее количество лайков в другой таблице.
Если вам нужно поменять запись, которая вставляется, делайте это в BEFORE INSERT и там уже set new.export = 1 сработает.

▲ 1

Там же приведен правильный пример.

CREATE DEFINER = `root`@`localhost` 
TRIGGER `NewRecord` AFTER INSERT ON `operator` 
FOR EACH ROW
BEGIN 
    SET NEW.Export=1;
END

писать запрос целиком к той же таблице нельзя. Поскольку он в свою очередь вызовет выполнение триггера - и так далее. Поэтому и существует специальный синтаксис, который и описан в той статье. просто сначала там дается пример неправильного синтаксиса, а ниже - "в конечном счёте правильный вариант".
Я согласен, что там написано не очень внятно, но если читать внимательно и до конца, то все становится на свои места.

Не обратил внимание, что это AFTER INSERT. MEW работает с BEFORE.

А вообще, конечно, нужен конкретный реальный пример, а не искусственный.