本人在开发我自己的大型OA软件过程中,需要改62个引擎类型为'InnoDB'的表一次性转化成MyISAM类型的表。

据说 Mysql开发商提供了一个Perl脚本,这里我用存储过程结合游标和动态SQL一次性实现。需要说明的是information_schema是MySql内置的系统数据库,而hxyoadb1是我自己的数据库。如果有人要进行转换,敬请先备份好自己的数据库,再把存储过程中的数据库修改成与自己数据库名称相一致(即将hxyoadb1改成你自己的数据库名),然后再执行本存储过程(即call  procedure proc_alerttableengine() )转换。

-- 功能:本存储过程,实现批次将表的引擎类型由'InnoDB'改成'MyISAM'
create procedure proc_alerttableengine() 
begin
  DECLARE tmpTablename varchar(50);
         DECLARE done INT DEFAULT 0;
         DECLARE  curRowId INT DEFAULT 0;        
  DECLARE cur1 cursor for select table_name from information_schema.tables A Where A.table_type='BASE TABLE' AND ENGINE='InnoDB' and table_schema='hxyoadb1' ;
         declare CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 此句一定要放在光标声明的后面
         open cur1;
          SET @table_name = '';    
          fetch cur1 into tmpTablename;   
          WHILE done = 0 DO   
             set curRowId = curRowId + 1;
             if @table_name = '' then
                set @table_name =  tmpTablename;
             else
  set @table_name = concat(@table_name, tmpTablename);
      end if;
             set @strsql = concat("ALTER TABLE ",tmpTablename ," ENGINE='MyISAM'");
         
      PREPARE stmt from @strsql ; -- 准备SQL语句
             EXECUTE   stmt;                      -- 执行SQL语句,改奕表的引擎为MyISAM
             fetch cur1 into tmpTablename;   
        END WHILE;
        -- 可用此句提示已经完成修改 select '表的引擎修改成功!'
  -- 改变前,可用此句统计'次数  select curRowId; 
       -- 改变前,可用此句统计有那些'InnoDB'表被改变了 select   @table_name ;
       close cur1; 
end;