Обновление таблицы в триггере после обновления в той же таблице

Как обновить столбец таблицы в триггере после обновления в той же таблице?
Здесь триггер:


CREATE TRIGGER upd_total_votes AFTER UPDATE ON products_score
FOR EACH ROW
    UPDATE
        products_score 
    SET
        products_score.votes_total =
            (SELECT
                 (votes_1 + votes_2 + votes_3 + votes_4 + votes_5)
             FROM
                 products_score
             WHERE
                 id = new.id)

Теперь, когда я обновляю таблицу, например


UPDATE products_score SET votes_1 = 5 WHERE id = 0

это не работает, поскольку я получаю следующее:

#1442 - Can't update table 'products_score' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Итак, как я могу заставить это работать?

Ответы

Ответ 1

Если вы измените свой триггер на BEFORE вместо AFTER, вы можете сделать это следующим образом:

CREATE TRIGGER upd_total_votes BEFORE UPDATE ON products_score 
FOR EACH ROW 
BEGIN
    SET new.votes_total = new.votes_1 + new.votes_2 + new.votes_3 + new.votes_4 + new.votes_5 
END
;

Ответ 2

У вас не может быть такого, как вы настроили, потому что триггер не может запрашивать другие строки той же таблицы, на которых он определен. Istead вы можете использовать Trigger перед обновлением, чтобы получить то, что вы хотите:

CREATE TRIGGER upd_total_votes BEFORE UPDATE ON products_score FOR EACH ROW     
BEGIN
    SET NEW.votes_total = NEW.votes_1 + NEW.votes_2 + NEW.votes_3 + NEW.votes_4 + NEW.votes_5;
END;

Или используйте хранимую процедуру для обновления таблицы.