mysql触发器“没有” FOR EACH ROW

Posted

技术标签:

【中文标题】mysql触发器“没有” FOR EACH ROW【英文标题】:mysql trigger "without" FOR EACH ROW 【发布时间】:2014-08-03 19:37:08 【问题描述】:

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

我有一个数据表(以下简称DT)为每个计数站点设计如下:startDate(DATETIME),dataCount(INT)。每条记录都包含计数的开始日期和柜台前访问的数量。每条记录的访问数量都清楚。记录间隔取决于计数器(通常是每小时数据)。

我有一张表(以下简称resumeDT)来汇总我所有的计数站点:名称、dateReferencelocationdescription...和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"

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

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

提前感谢您的帮助。

【问题讨论】:

不可能,MySQL 没有语句级触发器,只有行级触发器。顺便说一句:datecount 是列的 horrible 名称。一是因为它们是保留字,二是(更重要的是)它们根本不记录存储的内容。 “开始日期”? “结束日期”? “录制日期”? “有效期至日期”? 感谢您的快速回答。我将我的问题编辑得更明确。 这不会改变我的评论。使用 MySQL 中的触发器无法实现此目的。 也许是一种解决方法或任何建议可以在不使用触发器的情况下做我想做的事? 【参考方案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 确实处理此问题,可能会出现延迟。最好去看看

【讨论】:

以上是关于mysql触发器“没有” FOR EACH ROW的主要内容,如果未能解决你的问题,请参考以下文章

MySQL Trigger AFTER INSERT ON 'table name' FOR EACH ROW WHEN (role_id = 3)

MySQL创建触发器

WPS 2019 How To Create New Sheets For Each Row In Excel?

for each循环遍历数组

C++ for-each 语句触发“向量迭代器不兼容”断言失败:this->_Getcont() == 0

mysql触发器应用和创建表错误代码: 1118 Row size too large. 解决