Mysql使用游标批量修改数据

文章讲述了如何使用SQL存储过程优化MySQL表结构,提高数据操作效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

已经不记得上次写sql存储过程是什么时候的事情了,虽然说用ORM或配合注解加sql语句来访问数据库在研发效率和维护调试的便利性上绝对甩存储过程几条街;但是在做一些简单的数据整理和维护操作时,直接使用存储过程来实现还是更方便的;以下代码的功能是重置关卡表的主键字段,使其从1开始重新递增排列,并重置自增变量,用到了游标和主键约束的增删操作以及动态sql语句的执行,值得做个记录备忘。

代码实现

CREATE PROCEDURE `resetFcMapLevelIds`()
BEGIN
DECLARE var_level_id int(8);
DECLARE var_user varchar(255);
DECLARE var_game_group int(8);
DECLARE var_map_desc varchar(255);
DECLARE var_game_data text;
DECLARE var_id int;
DECLARE var_new_level_id int(8);
DECLARE count int(8);
declare i int(8);
-- 创建结束标志变量  
DECLARE done INT DEFAULT false;
declare cc cursor for select `user`, game_group,map_desc, game_data, level_id FROM fc_map_level ORDER BY level_id ASC;
-- 指定游标循环结束时的返回值  
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;  
ALTER TABLE fc_map_level MODIFY id INT;
ALTER TABLE fc_map_level DROP PRIMARY KEY;
open cc;
set i = 0;
WHILE not done DO
    FETCH cc INTO var_user, var_game_group, var_map_desc, var_game_data, var_level_id;
    SET i = i + 1;
  UPDATE fc_map_level SET id = i WHERE level_id = var_level_id;
END WHILE;
SELECT i;
close cc;
ALTER TABLE fc_map_level ADD PRIMARY KEY (id);
ALTER TABLE fc_map_level MODIFY id INT AUTO_INCREMENT;
set i = i + 1;
set @sql = concat('ALTER TABLE fc_map_level AUTO_INCREMENT=', i);
prepare st from @sql;
execute st;
END

 调用方式示意: 

CALL procedure_name(argument1, argument2, ...);

总结

使用SQL来实现还是非常直接和高效的,省去了客户端频繁调用的网络开销,如果MySql中有大批量的内联数据操作场景,使用存储过程依然是最好的解决方案。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值