mysql中游标的使用——批量修改表结构

笔者前段时间因为需要给许多表做同样的修改,而又不想一张一张的去改,所以百度了下看看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、命名问题

1、声明一个@开头的变量的时候必须要加上反引号(`),不然的话编译是不会通过的,会报语法错误;
2、PREPARE xxx FROM后面的参数不能使用反引号,不然也会报语法错误;

2、@@FETCH_STATUS属性无效

在mysql中无法使用@@FETCH_STATUS参数,因为mysql无法识别该参数,只能使用DECLARE CONTINUE HANDLER FOR NOT FOUND语句来声明终止循环条件

3、DEALLOCATE关键字无效

在mysql中使用DEALLOCATE关键字来关闭游标会报语法错误

4、不要写注释

执行的时候千万别写注释,不然会执行报错,笔者上方的sql是为了直观的展示,所以写了注释,但是执行的时候需要把注释去掉

猜你喜欢

转载自blog.csdn.net/qq_42697271/article/details/116916076
今日推荐