mysql触发"没有"FOR EACH ROW

Gwe*_*wen 8 mysql triggers

我设计了一个应用程序来分析一个城市不同地方的计数频率数据.

DT为每个计算站点设置了一个数据表(以下称为),如下所示:startDate(DATETIME),dataCount(INT).
每个记录都包含计数的开始日期和计数器前面的访问次数.每条记录的接收数量都很清楚.记录间隔取决于计数器(一般每小时数据).

我有一个表(以下简称resumeDT)来总结我的所有计数的网站:名称,dateReference,location,description... AND dailyAvg.

我想创建一个这种类型的触发器:

CREATE TRIGGER avgDT AFTER UPDATE,INSERT,DELETE ON DT
FOR EACH ROW UPDATE resumeDT SET avg= (SELECT AVG(tmp.sum) 
FROM (SELECT sum(count) FROM DT GROUP BY DATE(date)) tmp)
WHERE dateReference="DT"
Run Code Online (Sandbox Code Playgroud)

对我来说有点麻烦的是,如果我一次插入500个值,我将再执行500次UPDATE.我想在最后执行一次更新查询.
我知道FOR EACH ROW触发器的语法是强制性的,但我能找到一种解决方法来做我想要的吗?

也许只使用触发器来增加一个mysql变量@DTChanged并调用一个@DTChanged每秒扫描一次的外部脚本.if (@DTChanged!= 0 and lastDTChanged==@DTChanged)(没有1s的插入或更新)=>更新resumeDT
您有任何建议或其他解决方案吗?

在此先感谢您的帮助.

小智 1

关于触发器的问题是一个称为 RBAR(Row By Agonizing Row)的概念。标准触发器(最常用且易于实现)通常是基于行的

https://www.sqlservercentral.com/Forums/Topic642789-338-1.aspx

我不知道 MySQL 的基于语句的触发器。但它们确实存在于其他数据库引擎(RDBMS) https://en.wikipedia.org/wiki/Database_trigger

本案例的解决方案

1)在其他数据库上,有一个称为物化视图的标准功能。自动更新的可以满足您的需求。问题是,对于表上完成的每次更新,都会触发刷新,这需要资源和时间才能完成,并且会影响您的事务时间。某些数据库(例如 DB2)甚至能够使用汇总数据进行查询,而无需引用汇总表,因为它具有优化器功能。

2)对于MySQL,鉴于其开放性,其范围可以涵盖事务/二进制日志,其中记录对数据库所做的所有更改(这也称为流处理)。对此信息的范围称为(二进制日志)更改数据捕获。下面的工具 maxwells-daemon 允许您捕获和处理迄今为止所做的更改。甚至还有另一种工具可以模拟物化视图(flexviews)

http://maxwells-daemon.io/

https://www.percona.com/blog/2014/08/27/trawling-the-binlog-with-flexcdc-and-new-flexcdc-plugins-for-mysql/

https://mariadb.com/kb/en/library/flexviews/

请记住,二进制日志仅在事务提交后才“有效”/“有用”,因此,如果您的 CDC 处理此问题,可能会发生延迟。最好检查一下