mysql触发器“;没有「;每行

mysql触发器“;没有「;每行,mysql,triggers,Mysql,Triggers,我设计了一个应用程序来分析一个城市中不同地点的计数频度数据 我有一个数据表(以下简称为DT),用于设计如下的每个计数站点:startDate(DATETIME),dataCount(INT)。每个记录都包含计数的开始日期和计数器访问的数量。每个记录上的accesed数量都是明确的。记录间隔取决于计数器的类型(通常为每小时数据) 我有一个表(以下简称为resumeDT)来总结我所有的计算站点:名称、dateReference、位置、说明。。。和dailyAvg 我想创建一个此类触发器: CREAT

我设计了一个应用程序来分析一个城市中不同地点的计数频度数据

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

我有一个表(以下简称为
resumeDT
)来总结我所有的计算站点:名称、
dateReference
位置、
说明
。。。和
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个更新。我想在最后只执行一次更新查询。
我知道在触发器的语法中,
对于每一行
都是必须的,但是我能找到一个解决方法来做我想做的事情吗

可能使用触发器只是增加一个mysql变量
@DTChanged
,并调用一个每秒扫描
@DTChanged
的外部脚本<代码>如果(@DTChanged!=0和lastDTChanged==@DTChanged)
(1s内无插入或更新)=>更新
resumeDT

您有什么建议或其他解决方案吗


提前感谢您的帮助。

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

我不知道MySQL的基于语句的触发器。但它们确实存在于其他数据库引擎(RDBMS)中

本案的解决方案

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

2) 关于MySQL,考虑到它的开放性,它可以在事务/二进制日志上进行操作,记录对数据库所做的所有更改(这也称为流处理)。对该信息进行范围分析的方法称为(二进制日志)更改数据捕获。下面的工具maxwells守护进程允许您捕获和处理迄今为止所做的更改。甚至还有另一种模拟物化视图的工具(FlexView)


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

不可能,MySQL没有语句级触发器,只有行级触发器。顺便说一句:
date
count
是列的可怕名称。一是因为它们是保留字,二是(更重要的是)它们根本不记录它们存储的内容。“开始日期”?“结束日期”?“记录日期”?“有效期到日期”?谢谢你的快速回答。我编辑我的问题,使之更加明确。这不会改变我的评论。在MySQL中使用触发器是不可能做到这一点的。也许有一种解决方法或任何建议可以在不使用触发器的情况下做我想做的事情?