MySql数据遍历
需求
目前有月统计用水表,但是没有年统计用水表。
因为之前的问题,月统计用水表查询太慢,所以需要在数据库新建一个事件,一个月执行一次,将月统计计算后的年统计用水数据存入新的表中
思路
- 通过网上查找资料,采用游标方式遍历,可参考链接
- 从月统计用水表查询全部数据,遍历全部数据
- 判断年用水统计表是否已存在该年数据,已存在更新,不存在插入
BEGIN
-- 定义变量
DECLARE s int DEFAULT 0;
DECLARE deviceIdx varchar(50);
DECLARE yearx varchar(50);
DECLARE waterx DOUBLE(13,3);
-- 定义游标,并将sql结果集赋值到游标中
DECLARE report CURSOR FOR SELECT deviceId,`year`,SUM(water) AS water FROM to.me_obj_monthrecord WHERE objType = '030909' GROUP BY deviceId,`year`;
-- 声明当游标遍历完后将标志变量置成1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s = 1;
-- 打开游标
open report;
-- 将游标中的值赋值给变量
fetch report into deviceIdx,yearx,waterx;
-- 当s不等于1,即未遍历完,一直循环
WHILE s<>1 DO
IF (SELECT COUNT(*) AS count FROM me_monthrecord WHERE deviceId = deviceIdx AND `year` = yearx) > 0 THEN
UPDATE `to`.`me_monthrecord` SET `deviceId` = deviceIdx, `year` = yearx, `water` = waterx WHERE deviceId = deviceIdx AND `year` = yearx;
ELSE
INSERT INTO to.me_monthrecord (id,deviceId,`year`,water) VALUES (UUID(),deviceIdx,yearx,waterx);
END IF;
-- 将游标中的值再赋值给变量,供下次循环使用
fetch report into deviceIdx,yearx,waterx;
-- 当s等于1时表明遍历以完成,退出循环
END WHILE;
-- 关闭游标
close report;
END
mysql知识点补充
- mysql :=和=的区别
- 只有在set和update时才是和:=一样,赋值的作用,其它都是等于的作用。鉴于此,用变量实现行号时,必须用:=
- 不只在set和update时时赋值的作用,在select也是赋值的作用
- mysql 存储过程之游标(DECLARE)
更多推荐