Сообщение об ошибке довольно очевидно. TRIGGER
запрещено изменять таблицу, с которой сработал триггер.
Ограничение задокументировано в Справочном руководстве MySQL
https://dev.mysql.com/doc/refman/5.7/en/stored-program-restrictions.html
Хранимая функция или триггер не могут изменять таблицу, которая уже используется (для чтения или записи) оператором, который вызвал функцию или триггер.
В триггерах BEFORE INSERT
и BEFORE UPDATE
мы можем назначать значения столбцам вставляемой или обновляемой строки, ссылаясь на NEW.column_name
Например
-- check if value assigned to `col` is valid
IF NEW.col IN ('cash','checking','credit') THEN
-- it is valid, so do nothing
DO 0;
ELSE
-- value isn't valid, so override the provided value
SET NEW.col = 'cash';
END IF;
Пустой блок BEGIN END
предпочтительнее оператора DO 0;
. Кроме того, обязательно ожидайте значения NULL
и убедитесь, что они обрабатываются надлежащим образом. (Обратите внимание, что сравнение «не равно» с NULL
вернет NULL
, не true или false.)
-- check if value assigned to `col` is valid
IF NEW.col IN ('cash','checking','credit') THEN
-- it is valid, so do nothing
BEGIN END;
ELSE
-- value isn't valid, so override the provided value
SET NEW.col = 'cash';
END IF;