首页 > 数据库 > mysql教程 > 如何解决MySQL触发器导致的表更新错误?

如何解决MySQL触发器导致的表更新错误?

DDD
发布: 2024-12-26 22:44:13
原创
221 人浏览过

How to Resolve the MySQL Trigger-Induced Table Update Error?

触发器引发的表更新困境

更新后尝试在其自己的触发器内更新同一表时会出现常见的挑战。当触发器被设计为根据同一行中其他列的更改来修改表中的特定列时,这一点变得很明显。

示例:计算列总计

考虑以下场景,其中我们希望每次得分时更新“products_score”表中的“votes_total”列已修改:

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)
登录后复制

但是,在对表执行更新时,我们遇到错误:

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

此错误是由触发器逻辑中的循环引用引起的。更新语句尝试修改“votes_total”列,触发器也依赖该列来计算新的总数。

解决困境

要避免此问题,我们可以将触发器修改为在更新之前而不是之后执行:

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
;
登录后复制

在这个修改后的触发器中,我们计算新的“votes_total”值并分配它在实际更新发生之前到“新”行对象。这允许更新语句继续进行而不会遇到循环引用问题。

以上是如何解决MySQL触发器导致的表更新错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板