if new.LblStatusID<>0 then
call ipcconfigdb.doSummary(new.Summary);
end if;
以上是触发器里的代码
第一条 LblStatusID=0 第二条LblStatusID=1 第三条LblStatusID=0
在第二条去执行存储过程的时候第三条会插入么
插入操作是使用insert on update 语法
call ipcconfigdb.doSummary(new.Summary);
end if;
以上是触发器里的代码
第一条 LblStatusID=0 第二条LblStatusID=1 第三条LblStatusID=0
在第二条去执行存储过程的时候第三条会插入么
插入操作是使用insert on update 语法
建议你贴出完整的create trigger 代码,否则连你的这个触发器是写在什么上的都不知道 befoe insert ? after insert ?
`ID` int(11) NOT NULL AUTO_INCREMENT,
`LblID` int(11) DEFAULT '0',
`Date` datetime DEFAULT NULL,
`LblStatusID` int(11) DEFAULT '0',
`Summary` int(11) DEFAULT '0' COMMENT,
`LblValue` varchar(8000) DEFAULT '',
`IsSendComplete` int(11) DEFAULT '0',
`IsPpid` int(11) DEFAULT '0',
`IsExecute` int(11) DEFAULT '0',
PRIMARY KEY (`ID`),
UNIQUE KEY `lblid_u` (`LblID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TRIGGER `summary_ins` BEFORE INSERT ON `sum_datacache` FOR EACH ROW BEGIN if new.LblStatusID<>0 then
call ipcconfigdb.doSummary(new.Summary,new.Date,new.LblID,new.LblStatusID,new.LblValue);
end if;
END;这个是触发器的代码
CREATE PROCEDURE `doSummary`(summt int,date_p varchar(100),lblid_p int,lblstatusid_p int,lblvalue_p varchar(8000))
BEGIN DECLARE date2 varchar(200);
DECLARE datec int; set date2='';
IF (summt = 1) THEN
insert into ipcstorage.Summary(TotalCount,TotalOperationTime,LblID,LblStatusID,cdate) select 1 ,date_p,lblid_p,lblstatusid_p,now();
elseIF (summt = 2) THEN
select Date into date2 from ipcstorage.sum_datacache where lblid=lblid_p; if date2 ='' then
select Date into date2 from ipcstorage.lblnew where lblid=lblid_p;
end if;
SET datec = TIME_TO_SEC(TIMEDIFF(convert(date_p,datetime),convert(date2,datetime)));
if datec<>0 then
insert into ipcstorage.Summary(TotalTime,TotalOperationTime,LblID,LblStatusID,cdate)
select datec,date_p,lblid_p,lblstatusid_p,date2;
end if;
elseIF (summt = 3) THEN
select Date into date2 from ipcstorage.sum_datacache where lblid=lblid_p;
#insert ipcstorage.msgdown(msgdown) select date2 ='';
if date2 ='' then
select Date into date2 from ipcstorage.lblnew where lblid=lblid_p;
end if;
SET datec = TIME_TO_SEC(TIMEDIFF(date_p,date2));
if datec<>0 then
insert into ipcstorage.Summary(TotalCount,TotalTime,TotalOperationTime,LblID,LblStatusID,cdate)
select 0,datec,date_p,lblid_p,lblstatusid_p,date2;
end if;
insert into ipcstorage.Summary(TotalCount,TotalOperationTime,LblID,LblStatusID,cdate)
select 1 ,date_p, lblid_p,lblstatusid_p,now();
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;
这个是往那个表录数据的语句 , 就这一个地方。
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使用了非同步插入。此问题,困扰了很久,也许是我这段逻辑本身就有问题,请各位不吝赐教。