当前位置: 移动技术网 > IT编程>数据库>Mysql > MySQL使用游标批量处理进行表操作

MySQL使用游标批量处理进行表操作

2017年12月12日  | 移动技术网IT编程  | 我要评论

一、概述

本章节介绍使用游标来批量进行表操作,包括批量添加索引、批量添加字段等。如果对存储过程、变量定义、预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解这篇文章。

理解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来进行预编译。

 总结

 批量处理虽然有时候能提高工作的效率,但是带来的潜在危险也是挺大了,所以在执行之前必须要非常有把握你执行的语句对数据的影响,否则在生成环境就非常危险了。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网