触发器故障排除:与表修改不兼容
在 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中文网其他相关文章!