Mysql批量修改表名实现去掉表前缀
作者:顾米楠
文章介绍了在MySQL 5.7+中批量去除表名前缀"sw_"的方法,包括验证表名、版本检查和分步执行RENAME TABLE命令,建议先备份数据,通过查询生成重命名语句,逐个执行以避免操作中断,同时需注意应用代码对表名的依赖性
在项目中 我们可能遇到修改表名的需求 比如数据库中 部分表名带有前缀 部分表不带前缀 如果我想去掉这些带前缀的部分表名 应该怎么做呢?
使用代码层面修改太麻烦 不如直接使用mysql脚本达到目标 mysql版本要求在 5.7+
需求
将数据库中带有 sw_ 前缀的表 修改表名 去掉sw_
步骤
1. 先验证 执行前先运行以下查询确认要修改的表
SELECT table_name AS original_name,
SUBSTRING(table_name, 4) AS new_name
FROM information_schema.tables
WHERE table_schema = DATABASE()
AND table_name LIKE 'sw_%';
2. MySQL版本检查
SELECT VERSION();
注意 mysql版本需要 5.7+
3. 分步执行RENAME TABLE
-- 步骤1:创建临时表存储重命名映射
CREATE TEMPORARY TABLE temp_rename_mapping (
old_name VARCHAR(255),
new_name VARCHAR(255)
);
-- 步骤2:插入需要修改的表名
INSERT INTO temp_rename_mapping
SELECT
table_name AS old_name,
SUBSTRING(table_name, 4) AS new_name
FROM
information_schema.tables
WHERE
table_schema = DATABASE()
AND table_name LIKE 'sw_%';
-- 步骤3:生成并执行单个RENAME语句(更安全的方式)
DELIMITER //
CREATE PROCEDURE batch_rename_tables()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE old_tbl VARCHAR(255);
DECLARE new_tbl VARCHAR(255);
DECLARE cur CURSOR FOR SELECT old_name, new_name FROM temp_rename_mapping;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO old_tbl, new_tbl;
IF done THEN
LEAVE read_loop;
END IF;
SET @rename_sql = CONCAT('RENAME TABLE `', old_tbl, '` TO `', new_tbl, '`');
PREPARE stmt FROM @rename_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cur;
END //
DELIMITER ;
-- 执行存储过程
CALL batch_rename_tables();
-- 清理
DROP PROCEDURE batch_rename_tables;
DROP TEMPORARY TABLE temp_rename_mapping;
亲测有效~
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
