CREATE TABLE `sum_datacache` (
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '数据缓存表',
`LblID` int(11) DEFAULT '0' COMMENT '变量ID',
`Date` datetime DEFAULT NULL COMMENT '时间',
`LblStatusID` int(11) DEFAULT '0' COMMENT '变量状态 0正常1 报警 2故障',
`Summary` int(11) DEFAULT '0' COMMENT '是否汇总( 0不汇总 1计次汇总 2计时汇总 3计时并计次)',
`LblValue` varchar(8000) DEFAULT '' COMMENT '变量值',
`IsSendComplete` int(11) DEFAULT '0' COMMENT '是否传输',
`IsPpid` int(11) DEFAULT '0' COMMENT '永久保存表ID',
`IsExecute` int(11) DEFAULT '0' COMMENT '是否处理,0,处理,1,需要处理',
PRIMARY KEY (`ID`),
UNIQUE KEY `lblid_u` (`LblID`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
CREATE TRIGGER `summary_ins` BEFORE UPDATE ON `sum_datacache` FOR EACH ROW BEGIN
declare datec int;#时间差
set datec=0;
if new.LblStatusID<>0 then
/*计次*/
IF (new.summary = 1) THEN
insert into ipcstorage.Summary(TotalCount,TotalOperationTime,LblID,LblStatusID,cdate) select 1 ,new.date,new.lblid,new.lblstatusid,now();
elseIF (new.summary = 2) THEN /*计时汇总*/
SET datec = TIME_TO_SEC(TIMEDIFF(new.date,old.date));
if datec<>0 then
insert into ipcstorage.Summary(TotalTime,TotalOperationTime,LblID,LblStatusID,cdate)
select datec,new.date,new.lblid,new.lblstatusid,old.date;
end if;
elseIF (new.summary = 3) THEN #计时又计数汇总
SET datec = TIME_TO_SEC(TIMEDIFF(new.date,old.date));
#录入计时
if datec<>0 then
insert into ipcstorage.Summary(TotalTime,TotalOperationTime,LblID,LblStatusID,cdate)
select datec,new.date,new.lblid,new.lblstatusid,old.date;
end if;
#计数
insert into ipcstorage.Summary(TotalCount,TotalOperationTime,LblID,LblStatusID,cdate)
select 1 ,new.date, new.lblid,new.lblstatusid,now();
END IF;
end if;
END;
以上是触发器代码
INSERT INTO ipcstorage.sum_datacache(LblID,Date,LblValue,LblStatusID,Summary)
SELECT LblID,Date,LblValue,LblStatusID,Summary
from ipcstorage.datacache as d where isexecute = 0 and Summary<>0 and id <now_maxid
on DUPLICATE KEY
UPDATE LblID=d.LblID,Date=convert(d.Date,datetime),LblValue=d.lblvalue,
LblStatusID=d.lblstatusid,Summary=d.summary;
这个是会使触发器执行的代码,仅此一处。以上插入不存在并发调用情况
这个是运行数据,date是varchar型为了记录毫秒值convert(d.Date,datetime) 转换时毫秒被去掉了,
这批数据会被 使用 insert on DUPLICATE KEY UPDATE 就是上面的代码获取并录入sum_datacache。
这个是 触发器执行出来的结果
问题描述:
一般情况数据(totaltime)都是 正数, 是totalopertiontime 和cdate 的差值
在触发器中可以看出totaloperationtime 是最新数据的时间,cdate是上次数据的时间。
触发器的功能就是要计算出本次与上次的时间差。
从结果集 totaltime=-5的那条记录可以看出 上次的时间是2012-03-01 08:57:40 本次时间是2012-03-01 08:57:35
按代码逻辑来看 上次时间应该为 2012-03-01 08:57:34
问题1、出现这种情况纯属偶然现象,多数数据不会这样。我想问,我怎么避免这个负数,
问题2、这种情况是否证明我使用的mysql5.5 版本还不够稳定,或者我配置有问题
猜测:mysql insert使用了非同步插入。此问题,困扰了很久,也许是我这段逻辑本身就有问题,请各位不吝赐教。
这个是运行数据
这个是 触发器执行出来的结果
图片不能显示,麻烦上传一下图片
我这里可以的啊。你刷刷试试。
第一个图片地址
http://hi.csdn.net/attachment/201203/1/67026_1330581321Dwfd.gif
第二个图片地址
http://hi.csdn.net/attachment/201203/1/67026_1330581334gZYz.gif
@_刘宏伟_: 你事先在图片所在网站上访问过,被浏览器缓存了,你换个浏览器试试
@dudu: 你好,我补充了
结果出来了,使用insert select 数据插入顺序是不定的。有兴趣的同学可以试试。