mysql将所有数据库的表的相同字段更新为某一值
下面是将多个数据库的clientId更新,字段为字符串
1.创建存储过程
-- 创建存储过程,函数名为:proc_update_client_id CREATE PROCEDURE `proc_update_client_id`( ) BEGIN -- 定于全局变量tableName,就是循环时的表名 DECLARE tableName VARCHAR (200); -- 定义全局变量sql,就是每次循环执行的sql语句 DECLARE sqls VARCHAR ( 200 ); -- 定于全局变量done,默认为false,如果循环完毕,值变为true DECLARE done INT DEFAULT FALSE; -- 定于全局变量,要更新的值 DECLARE clientId VARCHAR(200); -- 声明游标,游标对应的结果集为查询出的所有符合条件的表名, -- 下面的select语句为查询表名,其中的TABLE_SCHEMA就是数据库名 DECLARE cursor_name CURSOR FOR SELECT CONCAT(tab.TABLE_SCHEMA,'.',col.table_name) FROM information_schema.TABLES tab LEFT JOIN information_schema.COLUMNS col ON col.table_name = tab.table_name WHERE table_type = 'BASE TABLE' AND col.column_name = 'client_id'; -- 当循环结束后,就把全局变量done设置为true DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 设置更新的值 SET clientId = 'bankdev'; -- 打开游标 OPEN cursor_name; my_loop:LOOP -- 游标当前指向的一条数据赋值给tableName FETCH cursor_name INTO tableName; -- 修改表的数据的sql SET sqls = CONCAT( ' update ', tableName, ' set client_id = "',clientId,'"'); -- 把要执行的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
2.执行存储过程
call proc_update_client_id()
3.删除存储过程
drop procedure proc_update_client_id;