必须用RENAME TABLE且显式带库名,ALTER TABLE RENAME非法;目标表名不能已存在;不支持变量;外键视图需手动更新;重命名会持原表和新表MDL锁,长事务会导致阻塞。

直接用 RENAME TABLE,别写 ALTER TABLE ... RENAME TO —— 后者在新版 MySQL 中语法非法,会报 ERROR 1064。
必须显式带上数据库名,哪怕刚执行过 USE db_name
MySQL 不允许省略库名。即使当前已选中数据库,写成 RENAME TABLE users TO users_new 也会报错 ERROR 1064 (42000)。
- ✅ 正确写法:
RENAME TABLE mydb.users TO mydb.users_new - ✅ 跨库重命名也一样:
RENAME TABLE old_db.logs TO new_db.logs_archive(要求new_db已存在) - ❌ 错误写法:
RENAME TABLE users AS users_new(AS不合法)、RENAME TABLE users, users_new(缺TO)
目标表名不能已存在,且不支持变量或动态拼接
RENAME TABLE 是纯 SQL 语句,不支持预处理变量、字符串拼接或函数调用。所有表名必须字面量写出。
- 目标表若已存在,会报
ERROR 1050 (42S01): Table 'xxx' already exists - 跨库操作时,目标库不存在则报
ERROR 1049 (42000): Unknown database 'xxx',不是权限问题 - 想批量重命名?只能手写多对:
RENAME TABLE t1 TO t1_bak, t2 TO t2_bak, t3 TO t3_bak;不能用循环或脚本生成 SQL 后再执行(除非你在客户端拼好再发)
外键、视图、存储过程不会自动更新,必须手动处理
重命名只改物理表名,不扫描任何 SQL 对象定义体。硬编码了旧表名的地方全会失效。
- 外键引用旧表名 → 后续
INSERT/UPDATE报ERROR 1824 (HY000): Failed to open the referenced table 'old_table' - 视图查询直接报
ERROR 1146 (42S02): Table 'db.old_table' doesn't exist - 查依赖用:
SELECT CONSTRAINT_NAME, TABLE_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = 'old_table' - 安全做法是:先删外键 → 重命名 → 重建外键;或临时关检查(
SET FOREIGN_KEY_CHECKS = 0),但得自己确保数据逻辑一致
真正容易被忽略的是锁行为:虽然 RENAME TABLE 很快,但它会同时持有原表和新表的元数据锁(MDL),如果此时有长事务正在读原表,整个重命名就会卡住等待——不是失败,是“挂起”。上线前务必用 SELECT * FROM information_schema.INNODB_TRX ORDER BY TRX_STARTED LIMIT 5 看有没有运行太久的事务。


















