Выполните триггер BEFORE UPDATE
, а не триггер AFTER UPDATE
.
(Я не думаю, что в триггере AFTER UPDATE возможно изменить строку, которая была обновлена и которая активировала триггер. I могу ошибаться, но я просто не могу понять, как это будет работать.)
Это демонстрация триггера BEFORE UPDATE на table_one
, который присваивает значение user_id
столбец (из обновляемой строки) на основе результата запроса:
DELIMITER $$
CREATE TRIGGER ...
BEFORE UPDATE ON table_one
BEGIN
# local variable we will temporarily store a value fetched from a query
DECLARE li_new_id BIGINT DEFAULT NULL; # match datatype of table_two.id
# lookup `id` value from `table_two` with a SQL query
SELECT s.id
INTO li_new_id
FROM table_two s
WHERE s.user = NEW.username
ORDER BY s.id
LIMIT 1 ;
# assign the value we fetched to the `user_id` column of the row being updated
SET NEW.user_id := li_new_id ;
END$$
DELIMITER ;
Обратите внимание, что если запрос не найдет подходящую строку, локальная переменная будет иметь значение NULL. Таким образом, оператор SET присвоит NULL столбцу user_id
. В триггере нет проверки, что назначаемое нами значение не будет нарушать ограничение (NOT NULL, UNIQUE, FOREIGN KEY).