mysql中有一张表,每天的新增数据量大概5000条记录,现在要将一个月前的所有记录存放到另一张表中,
将数据存放到另一张表后,就删除已经存放的记录,
我写一个储存过程如下
begin
-- 定义循环时的id
 declare rid int default null;
 declare stop int default 1;
-- 定义游标
 declare rowid  CURSOR FOR
(select clid from chargelog where DATE_FORMAT(CHARGETIME,'%Y-%m-%d') >= ADDDATE(NOW(), INTERVAL -31 DAY) );
-- 发生错误时,设置rid为-1
declare CONTINUE HANDLER FOR SQLSTATE '02000' SET stop = -1;
-- 打开游标
open rowid;
-- 读取第一行数据,并赋值给rid
FETCH rowid INTO rid;
-- 循环游标
-- WHILE (rid is not null ) DO
WHILE (stop > 0) DO
-- 开启事务
-- start transaction;
-- 插入数据
insert into chargelog_his  (select * from chargelog where clid = rid);
-- insert into chargelog_his (clid,nwid) values  (rid,rid+20);
-- 删除已经插入的数据
delete from chargelog where clid = rid;
-- rid = -1 表示有异常,则回滚
-- IF(rid = -1)
-- THEN
-- rollback;
-- END IF;
-- 无异常,提交事务
-- IF(rid != -1)
-- THEN
-- commit;
-- END IF;
FETCH rowid INTO rid;
END WHILE;
CLOSE rowid;
end本来我是想用两条sql语句就完成所有的数据存放,和删除,但是老大说,为了防止在删除的时候出现异常,
要的存放一条,删除一条。如果有异常就回滚,没有异常就提交事务
于是就只能写成上面的样子。现在我还没有添加事务,5000条整个过程需呀100秒左右,
但是用我下面写的
begin
insert into chargelog_his (select * from chargelog where DATE_FORMAT(CHARGETIME,'%Y-%m-%d') >= ADDDATE(NOW(), INTERVAL -31 DAY));
delete  from chargelog where DATE_FORMAT(CHARGETIME,'%Y-%m-%d') >= ADDDATE(NOW(), INTERVAL -31 DAY);
end
几秒钟就搞定。大家给点意见吧,我们老大是个死脑筋,
感觉屁都不懂,要求还多的很,我靠