MySQL使用游标批量处理进行表操作
程序员文章站
2024-02-23 22:12:58
一、概述
本章节介绍使用游标来批量进行表操作,包括批量添加索引、批量添加字段等。如果对存储过程、变量定义、预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先...
一、概述
本章节介绍使用游标来批量进行表操作,包括批量添加索引、批量添加字段等。如果对存储过程、变量定义、预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解这篇文章。
理解mysql变量和条件:
理解mysql prepare预处理语句:
理解mysql存储过程和函数:
二、正文
1、声明光标
declare cursor_name cursor for select_statement
这个语句声明一个光标。也可以在子程序中定义多个光标,但是一个块中的每一个光标必须有唯一的名字。
注意:select语句不能有into子句。
2、打开光标
declare cursor_name cursor for select_statement
这个语句打开先前声明的光标。
3、前进光标
fetch cursor_name into var_name [, var_name] ...
这个语句用指定的打开光标读取下一行(如果有下一行的话),并且前进光标指针。
4、关闭光标
close cursor_name
这个语句关闭先前打开的光标。
5、批量添加索引
共享一个批量添加索引的游标,当一个库中有上百张表结构一样但是名称不一样的表,这个时候批量操作就变得简单了。
#删除创建存储过程 drop procedure if exists founttable; delimiter $$ create procedure founttable() begin declare tablename varchar(64); #声明游标 declare cur_founttable cursor for select table_name from information_schema.tables where table_schema='front' and table_name like 'student%'; declare exit handler for not found close cur_founttable; #打开游标 open cur_founttable; repeat fetch cur_founttable into tablename; #定义预处理 set @sqlstr1 = concat('create index flag on ','`',tablename,'`',' (flag); '); set @sqlstr2 = concat('create index state on ','`',tablename,'`',' (state); '); set @sqlstr3 = concat('create index upload on ','`',tablename,'`',' (upload); '); set @sqlstr4 = concat('create index ccflag on ','`',tablename,'`',' (lockflag); '); set @sqlstr5 = concat('create index comes on ','`',tablename,'`',' (comes); '); ###set @sqlstr=concat(@sqlstr1,@sqlstr2,@sqlstr3,@sqlstr4,@sqlstr5 ); prepare stmt1 from @sqlstr1; prepare stmt2 from @sqlstr2; prepare stmt3 from @sqlstr3; prepare stmt4 from @sqlstr4; prepare stmt5 from @sqlstr5; execute stmt1; execute stmt2; execute stmt3; execute stmt4; execute stmt5; deallocate prepare stmt1; deallocate prepare stmt2; deallocate prepare stmt3; deallocate prepare stmt4; deallocate prepare stmt5; # select @sqlstr; until 0 end repeat; #关闭游标 close cur_founttable; end $$ delimiter ; call founttable();
这里有几个细节:
- 在声明游标的时候记得修改自己需要查询的条件
- 在预处理这里也需要改成对应的字段
- 在定义条件变量的时候这里我使用的是exit就是遇到错误就中断,当然也可以使用continue 。
注意:由于mysql在存储过程当中无法将查询出来的变量名直接作为表名来用,所以这里要用到动态拼接sql的方法,但是通常的set concat的方法并不管用,所以这里就使用了prepare来进行预编译。
总结
批量处理虽然有时候能提高工作的效率,但是带来的潜在危险也是挺大了,所以在执行之前必须要非常有把握你执行的语句对数据的影响,否则在生成环境就非常危险了。
上一篇: java文件处理工具类详解
推荐阅读
-
MySQL使用游标批量处理进行表操作
-
MySQL使用游标批量处理进行表操作
-
存储过程-使用游标、临时表、表变量、实现对表中数据进行操作
-
mysql开发之---使用游标双层嵌套对总表进行拆分为帖子表和回复表_MySQL
-
emoji - thinkphp mysql 如何对指定表使用指定字符编码进行查询和操作?
-
mybatis使用annotation在mysql,oracle上进行批量处理
-
mybatis使用annotation在mysql,oracle上进行批量处理
-
mysql使用游标进行删除操作的存储过程_MySQL
-
mysql使用游标进行删除操作的存储过程_MySQL
-
emoji - thinkphp mysql 如何对指定表使用指定字符编码进行查询和操作?