mysql批量更新数据库内全部表某个字符串为另外一个字符串

示例:把指定数据库minex-pms所有表中的project_depart_name字段 重庆项目部更改为渝北项目部,不存在project_depart_name字段的表排除掉,使用临时表和sql脚本的方式实现

sql脚本:

-- 1. 创建实体表来存储需要更新的表名
CREATE TABLE IF NOT EXISTS tables_to_update (
    table_name VARCHAR(255)
);

-- 2. 插入需要更新的表名(排除视图)
INSERT INTO tables_to_update (table_name)
SELECT c.TABLE_NAME
FROM information_schema.COLUMNS c
JOIN information_schema.TABLES t ON c.TABLE_SCHEMA = t.TABLE_SCHEMA AND c.TABLE_NAME = t.TABLE_NAME
WHERE c.TABLE_SCHEMA = 'minex-pms'
AND c.COLUMN_NAME = 'project_depart_name'
AND t.TABLE_TYPE = 'BASE TABLE'; -- 排除视图,只选择实际的表

-- 3. 删除已存在的存储过程(如果存在)
DROP PROCEDURE IF EXISTS update_project_depart_name;

-- 4. 创建存储过程来遍历实体表并执行更新操作
DELIMITER //

CREATE PROCEDURE update_project_depart_name()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE tbl_name VARCHAR(255);
    DECLARE cur CURSOR FOR SELECT table_name FROM tables_to_update;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;

    read_loop: LOOP
        FETCH cur INTO tbl_name;
        IF done THEN
            LEAVE read_loop;
        END IF;
        SET @sql = CONCAT('UPDATE ', tbl_name, ' SET project_depart_name = ''渝北项目部'' WHERE project_depart_name = ''重庆项目部''');
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END LOOP;

    CLOSE cur;
END //

DELIMITER ;

-- 5. 调用存储过程执行更新操作
CALL update_project_depart_name();

-- 6. 删除实体表(可选,根据需求决定是否保留)
DROP TABLE IF EXISTS tables_to_update;

-- 7. 删除已存在的存储过程(如果存在)
DROP PROCEDURE IF EXISTS update_project_depart_name;

以上脚本可以实现指定字段的需求

 

方式2如果数据量不大的话,可以使用navicat工具 先进行库内查找 再手动单张表进行替换

posted @ 2024-12-20 16:38  官萧何  阅读(6)  评论(0编辑  收藏  举报