首页 新闻 会员 周边

mysql插入或触发器问题

0
[已解决问题] 解决于 2012-09-14 17:24

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使用了非同步插入。此问题,困扰了很久,也许是我这段逻辑本身就有问题,请各位不吝赐教。

问题补充:

这个是运行数据

 

这个是 触发器执行出来的结果

姜小牙的主页 姜小牙 | 菜鸟二级 | 园豆:248
提问于:2012-03-01 14:34
< >
分享
最佳答案
0

图片不能显示,麻烦上传一下图片

奖励园豆:5
dudu | 高人七级 |园豆:30994 | 2012-03-01 15:22

我这里可以的啊。你刷刷试试。

第一个图片地址

http://hi.csdn.net/attachment/201203/1/67026_1330581321Dwfd.gif

第二个图片地址

http://hi.csdn.net/attachment/201203/1/67026_1330581334gZYz.gif

姜小牙 | 园豆:248 (菜鸟二级) | 2012-03-01 19:59

@_刘宏伟_: 你事先在图片所在网站上访问过,被浏览器缓存了,你换个浏览器试试

dudu | 园豆:30994 (高人七级) | 2012-03-01 20:51

@dudu: 你好,我补充了

姜小牙 | 园豆:248 (菜鸟二级) | 2012-03-02 13:01
其他回答(1)
0

结果出来了,使用insert select 数据插入顺序是不定的。有兴趣的同学可以试试。

姜小牙 | 园豆:248 (菜鸟二级) | 2012-03-11 16:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册