18

在同一张表上更新后,如何在触发器中更新表的列?
这是触发器:


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 - 无法更新存储函数/触发器中的表“products_score”,因为它已被调用此存储函数/触发器的语句使用。

那么我到底怎么才能让它工作呢?

4

2 回答 2

30

如果您将触发器更改为,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
;
于 2010-12-28T16:26:59.343 回答
8

您不能按照您的设置方式进行设置,因为触发器无法查询定义它的同一表的其他行。相反,您可以使用更新前触发器来实现您想要的:

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;

或者使用存储过程来更新表。

于 2010-12-28T16:27:40.470 回答