笔者前段时间因为需要给许多表做同样的修改,而又不想一张一张的去改,所以百度了下看看mysql有没有可以做批量修改的功能,然后就找到了游标这个工具,本文主要是介绍了下游标的简单使用和笔者在使用过程中遇到的一些坑。
目录
一、游标是什么?
游标是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。
二、游标的简单使用
游标主要是用于存储过程中筛选出部分需要的数据,如下方的sql语句:
CREATE DEFINER=`muyichen`@`%` PROCEDURE `batch_add_pk`()
DETERMINISTIC
COMMENT '批量新增表字段(pk)'
BEGIN
DECLARE `@done` INT DEFAULT 0;
DECLARE `@tableName` VARCHAR(50);
DECLARE `@sqlstr` VARCHAR(2000);
-- 查找出数据库中包含有myPk字段的表
DECLARE SysTable CURSOR FOR SELECT DISTINCT TABLE_NAME FROM information_schema.COLUMNS WHERE COLUMN_NAME = 'myPk' AND TABLE_SCHEMA = 'muyichen';
-- 设置循环终止条件
DECLARE CONTINUE HANDLER FOR NOT FOUND SET `@done` = 1;
-- 打开游标
OPEN SysTable;
-- 开始循环遍历
read_loop:loop
-- 将游标中的下一条数据赋值给@tableName
FETCH NEXT FROM SysTable INTO `@tableName`;
-- 终结循环条件
IF `@done` =1 THEN
LEAVE read_loop;
END IF;
-- 构建改表sql语句
SET @sqlstr = CONCAT("ALTER TABLE ", `@tableName` ," ADD pk varchar(20) NULL COMMENT '账号标示'");
-- 执行sql语句
PREPARE stmt FROM @sqlstr;
EXECUTE stmt;
SET `@done` = 0;
end loop read_loop;
-- 关闭游标
CLOSE SysTable;
END
上述sql的功能是:
给名字为muyichen的数据库中所有包含有mypk字段的表添加上pk字段;
三、使用过程中遇到的问题
1、命名问题
声明一个变量的时候必须要加上反引号(`),不然的话编译是不会通过的,会报语法有问题
2、@@FETCH_STATUS属性无效
在mysql中无法使用@@FETCH_STATUS参数,因为mysql无法识别该参数,只能使用DECLARE CONTINUE HANDLER FOR NOT FOUND语句来声明终止循环条件
3、DEALLOCATE关键字无效
在mysql中使用DEALLOCATE关键字来关闭游标会报语法错误