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;

 

posted @ 2021-05-27 14:43  24601  阅读(700)  评论(0编辑  收藏  举报