首页 >数据库 >mysql教程 >为什么我无法更新正在修改 MySQL 中同一表的触发器内的表?

为什么我无法更新正在修改 MySQL 中同一表的触发器内的表?

Patricia Arquette
Patricia Arquette原创
2024-11-08 22:52:02718浏览

Why Can't I Update a Table Inside a Trigger That's Modifying the Same Table in MySQL?

触发器故障排除:与表修改不兼容

在 MySQL 中,触发器是一个强大的工具,用于根据特定事件自动执行数据库操作。然而,当触发器在执行中遇到问题时,故障排除至关重要。本文解决了 MySQL 触发器无法工作时遇到的常见错误。

问题描述:

用户报告其触发器未更新特定列(PTS) ) 当 pos_table 中相应的 Played_games 列发生变化时。尽管手动执行查询,但触发器未能触发更新。

触发器结构:

CREATE TRIGGER `upd_PTS` AFTER UPDATE ON `pos_table`
FOR EACH ROW BEGIN
    IF (NEW.played_games <> OLD.played_games)
    THEN  
        update pos_table set PTS=((NEW.won_games*2)+(NEW.tie_games*1));
    END IF;
END

遇到错误:

当尝试手动编辑 Played_games 列时,用户收到一条错误消息:“无法更新存储函数/触发器中的表 pos_table,因为它已被调用此存储函数/触发器的语句使用”。

解决方案:

问题源于以下事实:触发器试图修改触发事件(played_games 的更新)中引用的同一表 (pos_table)。正如 MySQL 的存储程序限制中所述,存储函数或触发器不能修改调用语句已在使用的表。

替代解决方案:

避免对于这个问题,建议使用 BEFORE INSERT 触发器来代替。在这种情况下,可以按如下方式修改触发器:

CREATE TRIGGER `upd_PTS` BEFORE INSERT ON `pos_table`
FOR EACH ROW BEGIN
    SET NEW.PTS = ((NEW.won_games*2)+(NEW.tie_games*1));
END

其他注意事项:

除了遇到的错误之外,本文还强调了以下问题:存储像 PTS 这样的计算列。由于在显示过程中可以轻松地从其他列计算它,因此避免将其存储为单独的列可能会更高效且不易出错。

以上是为什么我无法更新正在修改 MySQL 中同一表的触发器内的表?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn