Очевидный ответ - переключиться на триггер BEFORE UPDATE
, как указал Дж. Купер ... однако, если есть какая-то причина, по которой вы обязательно должны использовать AFTER UPDATE
, тогда вы должны установить флаг, который говорит что поле нужно пересчитать и проверить его в своем триггере. Одним из способов сделать это было бы установить поле на NULL
в BEFORE
триггере и затем проверить NULL в AFTER
триггере, то есть
CREATE TRIGGER bu_trigger BEFORE UPDATE
BEGIN
-- mark field for recalculation if needed
IF(update invalidates the field1 value)THEN
NEW.field1 = NULL;
END
CREATE TRIGGER au_trigger AFTER UPDATE
BEGIN
-- only update if the field is NULL
IF(NEW.field1 IS NULL)THEN
UPDATE table1 SET field1 = ...;
END
Но, используя эту технику, вам, вероятно, придется использовать множество IF(OLD.field IS DISTINCT FROM NEW.field)THEN
проверок в триггерах, чтобы избежать ненужных обновлений в ваших триггерах.