在mysql数据库运维和开发过程中,给表名统一添加前缀是常见的需求,比如需要区分测试环境和生产环境的表,或者做数据库拆分时需要给原有表增加业务标识前缀,手动逐个修改表名不仅效率低下,还容易出现遗漏或者拼写错误的问题,通过编写循环脚本可以批量完成这个操作。

mysql重命名表的基础语法
mysql中修改表名的基础语法是RENAME TABLE,基本用法如下:
-- 单个表重命名语法 RENAME TABLE 旧表名 TO 新表名; -- 示例:给user表添加前缀t_ RENAME TABLE user TO t_user;
如果需要同时修改多个表的名称,也可以在一条语句中完成:
-- 同时重命名多个表 RENAME TABLE 旧表名1 TO 新表名1, 旧表名2 TO 新表名2;
批量给表添加前缀的循环脚本实现
如果数据库中的表数量较多,手动写每条重命名语句显然不现实,我们可以通过存储过程结合游标的方式,循环遍历数据库下的所有表,自动添加前缀。以下是完整的实现脚本:
-- 设置分隔符,避免存储过程中的分号被提前解析
DELIMITER $$
-- 如果存在同名的存储过程先删除
DROP PROCEDURE IF EXISTS add_table_prefix $$
-- 创建存储过程,参数说明:
-- db_name:要操作的数据库名称
-- prefix:要添加的前缀
CREATE PROCEDURE add_table_prefix(IN db_name VARCHAR(100), IN prefix VARCHAR(50))
BEGIN
-- 定义变量
DECLARE done INT DEFAULT 0;
DECLARE old_table_name VARCHAR(100);
DECLARE new_table_name VARCHAR(150);
-- 定义游标,查询指定数据库下所有非临时表的表名
DECLARE table_cursor CURSOR FOR
SELECT table_name
FROM information_schema.tables
WHERE table_schema = db_name AND table_type = 'BASE TABLE';
-- 定义异常处理,游标遍历完之后设置done为1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 打开游标
OPEN table_cursor;
-- 循环遍历游标
read_loop: LOOP
-- 获取游标当前指向的表名
FETCH table_cursor INTO old_table_name;
-- 如果遍历完成则退出循环
IF done = 1 THEN
LEAVE read_loop;
END IF;
-- 拼接新的表名,加上前缀
SET new_table_name = CONCAT(prefix, old_table_name);
-- 执行重命名操作
SET @rename_sql = CONCAT('RENAME TABLE ', db_name, '.', old_table_name, ' TO ', db_name, '.', new_table_name);
-- 预处理SQL语句
PREPARE stmt FROM @rename_sql;
-- 执行预处理语句
EXECUTE stmt;
-- 释放预处理语句
DEALLOCATE PREPARE stmt;
END LOOP;
-- 关闭游标
CLOSE table_cursor;
END $$
-- 恢复默认分隔符
DELIMITER ;
-- 调用存储过程,给test_db数据库的所有表添加前缀t_
-- 第一个参数是数据库名,第二个参数是要添加的前缀
CALL add_table_prefix('test_db', 't_');
脚本使用注意事项
- 执行脚本前一定要先备份数据库,避免操作失误导致表名修改错误无法恢复。
- 如果表中存在外键约束,重命名表可能会导致外键失效,需要先处理外键约束再执行重命名操作。
- 存储过程中的数据库名和前缀参数需要根据实际情况修改,不要直接复制执行。
- 如果只需要给部分表添加前缀,可以修改游标的查询条件,比如增加
table_name LIKE 'user_%'这样的过滤条件,只处理符合规则的表。 - 执行完成后可以查询
information_schema.tables表,确认所有表的名称已经正确修改。
验证修改结果
执行完批量重命名脚本后,可以通过以下SQL语句查询数据库下的所有表名,确认前缀已经正确添加:
-- 查询指定数据库下的所有表名 SELECT table_name FROM information_schema.tables WHERE table_schema = 'test_db' AND table_type = 'BASE TABLE';
如果需要撤销操作,只需要调整存储过程的前缀参数,把新前缀设置为空,或者编写反向的脚本,去掉已经添加的前缀即可。