if new.LblStatusID<>0 then
call ipcconfigdb.doSummary(new.Summary);
end if;
以上是触发器里的代码
第一条 LblStatusID=0 第二条LblStatusID=1 第三条LblStatusID=0
在第二条去执行存储过程的时候第三条会插入么
插入操作是使用insert on  update 语法

解决方案 »

  1.   

    触发器是针对每行记录的。
    建议你贴出完整的create trigger 代码,否则连你的这个触发器是写在什么上的都不知道 befoe insert ? after insert ?
      

  2.   

    CREATE TABLE `sum_datacache` (
      `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;这个是触发器的代码
      

  3.   


    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
    这个是存储过程
      

  4.   


    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;
    这个是往那个表录数据的语句 , 就这一个地方。
      

  5.   


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

  6.   

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