mysql批量更新多张表中的相同字段

项目需求,给所有表加一个区域字段(area_id),后来又要求都先赋值为默认值,于是就有了下面这个记录,已经自己执行过:
刚开始不太会写存储过程,然后网上一搜,有个大佬已经写出来了,但不明意思,保存该存储过程时也报错,然后查相关资料,大概明白是什么意思,然后改吧改吧,就自己使用了,原文章在这里:
mysql 存储过程 批量更新所有表中相同的字段名

-- 创建存储过程,函数名为:proc_update_area_id
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_update_area_id`( )
BEGIN
	-- 定于全局变量tableName,就是循环时的表名
	DECLARE tableName VARCHAR (30);
	-- 定义全局变量sql,就是每次循环执行的sql语句
	DECLARE sqls VARCHAR ( 200 );
	-- 定于全局变量done,默认为false,如果循环完毕,值变为true
	DECLARE done INT DEFAULT FALSE;
	-- 定于全局变量,要更新的值
	DECLARE areaId BIGINT(10);
	
	-- 声明游标,游标对应的结果集为查询出的所有符合条件的表名,
	-- 下面的select语句为查询表名,其中的TABLE_SCHEMA就是数据库名
	DECLARE cursor_name CURSOR FOR
		SELECT
			col.table_name 
		FROM
			information_schema.TABLES tab
			LEFT JOIN information_schema.COLUMNS col ON col.table_name = tab.table_name 
		WHERE
			tab.table_type = 'BASE TABLE' 
			AND tab.TABLE_SCHEMA = 'innovation' 
			AND col.column_name = 'area_id';
	-- 当循环结束后,就把全局变量done设置为true
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
	-- 设置更新的值
	SET areaId = 110100;
	-- 打开游标
	OPEN cursor_name;
	my_loop:LOOP
		-- 游标当前指向的一条数据赋值给tableName
		FETCH cursor_name INTO tableName;
		-- 修改表的数据的sql
		SET sqls = CONCAT( ' update ', tableName, ' set area_id=', areaId );
		-- 把要执行的sql语句赋值给@a变量
		SET @a = sqls;
		-- 预处理语句
		PREPARE stmt1 FROM @a;
		-- 执行预处理语句
		EXECUTE stmt1;
		-- 删除预处理语句
		DEALLOCATE PREPARE stmt1;
		-- 每次检查done变量,如果为true,就跳出循环
		IF done THEN LEAVE my_loop;
		END IF;
	-- 结束循环
	END LOOP;
	-- 关闭游标
	CLOSE cursor_name;
END

(PS:上次学了存储过程,学完没用过,再用时,已经忘了,今天就把它写下来)

发布了33 篇原创文章 · 获赞 24 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/Myc_CSDN/article/details/103198027