一、概述
本章节介绍使用游标来批量进行表操作,包括批量添加索引、批量添加字段等。如果对存储过程、变量定义、预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解这篇文章。
理解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();
这里有几个细节:
注意:由于mysql在存储过程当中无法将查询出来的变量名直接作为表名来用,所以这里要用到动态拼接sql的方法,但是通常的set concat的方法并不管用,所以这里就使用了prepare来进行预编译。
总结
批量处理虽然有时候能提高工作的效率,但是带来的潜在危险也是挺大了,所以在执行之前必须要非常有把握你执行的语句对数据的影响,否则在生成环境就非常危险了。
如对本文有疑问, 点击进行留言回复!!
ui设计是什么?从UI设计的角度,王者荣耀马超限定皮肤另有亮点!
网友评论