mysql 8.0.33+ 和 8.4 起仅支持 rename table,已彻底移除 alter table ... rename to;必须通过 information_schema 查询生成语句,注意外键、长事务、从库 binlog 等隐性依赖,并同步更新视图、应用缓存等外部引用。

必须用 RENAME TABLE,别写 ALTER TABLE ... RENAME TO
MySQL 8.0.33+ 和 8.4 版本已彻底移除 ALTER TABLE old_name RENAME TO new_name 语法,执行直接报 ERROR 1064。这不是兼容性警告,是硬性不支持。唯一合法、原子、支持批量的命令只有 RENAME TABLE,它本身是独立语句,不是 ALTER TABLE 的子句。
生成语句前先查 information_schema.tables,别手敲
人工拼接容易错位、漏表、反向替换(比如把 log_202301 改成 old_log_202301 而非 new_log_202301)。真实场景中表名常带规律前缀(如 wp_、bak_),靠 SHOW TABLES 再逐个改效率低且易出错。
- 先确认范围:
SELECT table_name FROM information_schema.tables WHERE table_schema = 'your_db' AND table_name LIKE 'old_%'; - 再生成语句:
SELECT CONCAT('RENAME TABLE ', table_name, ' TO ', REPLACE(table_name, 'old_', 'new_'), ';') FROM information_schema.tables WHERE table_schema = 'your_db' AND table_name LIKE 'old_%'; - 复制结果前务必
SET SQL_SAFE_UPDATES = 0;(如果会话启用了安全模式)
执行前必须检查三个隐性依赖
RENAME TABLE 不报错,不代表能成功或业务不受影响。卡住、失败、改完立刻出错,往往源于外部依赖:
- 外键约束:目标库中若有视图、存储过程、触发器或外键硬编码了旧表名,rename 后查询/插入会直接失败
- 长事务:某张表正被一个未提交的 UPDATE 占用,
RENAME TABLE会等它释放 MDL 锁——可能卡几十秒甚至更久 - 从库风险:默认会写 binlog,若在从库上直接执行,可能引发复制中断;必须显式加
SET sql_log_bin = 0;
跨库移动或交换表名要按顺序写全
RENAME TABLE 严格从左到右执行,不能省略中间步骤。例如上线新表时想交换 orders 和 orders_new:
- ✅ 正确三步:
RENAME TABLE orders TO tmp, orders_new TO orders, tmp TO orders_new; - ❌ 错误写法:
RENAME TABLE orders TO orders_new, orders_new TO orders;(第二步时orders_new已不存在) - 跨库必须写全名:
RENAME TABLE db1.t1 TO db2.t1;,且用户需对两个库都有ALTER和DROP权限











