【问题标题】:Updating table in trigger after update on the same table在同一表上更新后在触发器中更新表
【发布时间】:2011-05-31 15:41:19
【问题描述】:

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

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”,因为它已被调用此存储函数/触发器的语句使用。

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

【问题讨论】:

    标签: mysql sql mysql-error-1442


    【解决方案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】:

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

      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;
      

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

      【讨论】:

      • 更新后在触发器内调用存储过程的相同错误消息
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      相关资源
      最近更新 更多