Триггер mySQL не может обновить таблицу, которая уже используется оператором, который вызвал триггер - PullRequest
1 голос
/ 02 декабря 2011

После создания любого из триггеров ниже я получаю сообщение об ошибке (подробно после кода), когда пытаюсь сделать обновление.Независимо от того, каким путем я иду, я не могу обновить таблицу.Нужно ли создавать новую таблицу и помещать в нее один столбец для обновления, или есть способ обойти это? На этой странице говорится: «Внутри хранимой функции или триггера запрещено изменять таблицу, которая уже используется (для чтения или записи) оператором, который вызвал функцию или триггер».Но тогда какой смысл в новых и старых ключевых словах?Я просто неправильно их использую?

таблица: галерея

столбцы: вес, модификатор, рейтинг

триггер: updateRating

CREATE TRIGGER updateRating
BEFORE UPDATE ON gallery
FOR EACH ROW
UPDATE gallery SET rating= sum(NEW.weight * NEW.modifier)

или

CREATE TRIGGER updateRating
AFTER UPDATE ON gallery
FOR EACH ROW
UPDATE gallery SET rating= sum(weight * modifier)

SQL-запрос: Изменить

ОБНОВИТЬ `acs`.gallery` SET` weight` = '6' WHERE `gallery``id` = 1 LIMIT 1

MySQL сказал: Документация

# 1442 - Невозможно обновить таблицу 'gallery' в сохраненной функции / триггере, поскольку она уже используется оператором, который вызвал эту хранимую функцию / триггер.

1 Ответ

5 голосов
/ 02 декабря 2011

Правильно, ошибка означает, что вы не можете изменить таблицу gallery, так как для этой таблицы определен триггер.Существует один возможный способ обновить значение, это триггер BEFORE UPDATE, здесь приведен пример -

CREATE TRIGGER updateRating
BEFORE UPDATE
ON gallery
FOR EACH ROW
BEGIN
  SET NEW.rating= NEW.weight * NEW.modifier; -- You may update a NEW value.
END

В конце позвольте мне задать вопрос.Почему вы собираетесь использовать триггер для изменения rating?Я хочу сказать, что вы можете вычислить rating на лету, в операторе SELECT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...