MariaDB触发器未同步视图更新,插入错误值问题求助
问题原因与解决方案
原因
MariaDB 10.2.15版本中,触发器在创建时会缓存所依赖对象的执行计划和定义。当你修改view_A把SUM()改成AVG()后,触发器并不会自动感知到视图的变化,依然沿用创建时缓存的旧视图逻辑执行——这就是为什么手动查视图能得到正确结果,但触发器插入的还是旧的SUM值。只有当触发器本身被重新编译(比如你修改内容再保存)时,它才会重新解析依赖的视图,使用更新后的逻辑。
解决方法
针对这个问题,有几种可行的处理方式:
1. 手动重新编译触发器
不需要修改触发器的实际逻辑,只需重新执行触发器的创建语句(或者用ALTER TRIGGER),就能触发重新编译,让它加载最新的视图定义。比如:
delimiter // ALTER TRIGGER trigger_A AFTER INSERT ON table_A FOR EACH ROW BEGIN select date_time , lines_ INTO @date_time , @lines_ from view_A where date_time like '2023-05-19 09%'; insert into table_B (date_time, lines_) values (@date_time, @lines_) on duplicate key update date_time = @date_time , lines_ = @lines_; END; // delimiter ;
2. 把视图逻辑内联到触发器中
避免依赖外部视图,直接将view_A的查询逻辑写到触发器里。这样后续修改聚合逻辑时,直接修改触发器即可,不会有缓存不一致的问题:
delimiter // CREATE TRIGGER trigger_A AFTER INSERT ON table_A FOR EACH ROW BEGIN SELECT CONCAT(SUBSTR(`table_A`.`date_time`, 1, 13), ':00:00') as date_time, ROUND(AVG(`table_A`.`lines_`), 1) as lines_ INTO @date_time, @lines_ FROM table_A WHERE date_time like '2023-05-19 09%' GROUP BY CONCAT(SUBSTR(`table_A`.`date_time`, 1, 13), ':00:00'); insert into table_B (date_time, lines_) values (@date_time, @lines_) on duplicate key update date_time = @date_time , lines_ = @lines_; END; // delimiter ;
3. 升级MariaDB版本
这个缓存问题在MariaDB 10.3及以上的版本中已经被优化,触发器会更及时地感知依赖对象的变化。如果业务允许,可以考虑升级到更高版本从根源解决问题。
内容的提问来源于stack exchange,提问作者Blackegg13
相关产品推荐
相关产品推荐

