欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

 总结

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