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
几秒钟就搞定。大家给点意见吧,我们老大是个死脑筋,
感觉屁都不懂,要求还多的很,我靠
将数据存放到另一张表后,就删除已经存放的记录,
我写一个储存过程如下
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
几秒钟就搞定。大家给点意见吧,我们老大是个死脑筋,
感觉屁都不懂,要求还多的很,我靠
解决方案 »
- You have an error in your SQL syntax
- 这样的sql语句怎么写啊????
- myisam锁表问题
- 一个sql写法问题,请教~~~
- 求 MySql 5.10 的下载地址!
- MySql是否支持子查询?
- 送分来了,LINUX下,怎么执行MYSQL,进入命令提示符理,我启动后,执行另外一个MYSQL脚本,说我权限拒绝,怎么办?
- 错误:Duplicate entry '0' for key 1!?!?!?!
- sphinx for mysql on windows 怎么安装?
- 麻烦大家帮忙看看,oracle过程转mysql
- 提个问题,mysql下查询每个类别前2条记录
- 如何批处理启动mysql服务
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);这个方法,把这两句放到一个事务中,应该是没有问题的啊。5000条记录也不算大。