首页 > 数据库 > mysql教程 > 使用更新后触发器时如何防止'无法更新存储函数/触发器中的表”错误?

使用更新后触发器时如何防止'无法更新存储函数/触发器中的表”错误?

Linda Hamilton
发布: 2024-12-26 22:28:14
原创
702 人浏览过

How Can I Prevent

同一个表更新后触发更新

在数据库系统中,触发器用于在表中发生某些事件时自动执行特定操作。在更新表后尝试从触发器内更新同一个表时,会出现一个常见的挑战。

考虑以下触发器:

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

要解决此问题,触发器必须修改为在更新事件之前执行,而不是之后。这允许触发器在应用原始更新语句之前更新表:

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 列更新。

以上是使用更新后触发器时如何防止'无法更新存储函数/触发器中的表”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

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