改名机制与代价
表改名本身很快:MySQL 用 RENAME TABLE,一条语句可以同时改多张表且整体原子完成;PostgreSQL 用 ALTER TABLE ... RENAME TO,放在事务里可以回滚。真正的工作量不在改名动作,而在同步依赖它的对象与代码:视图、存储过程、触发器、授权、ORM 映射、复制过滤规则可能都还写着旧名。
基本信息
| MySQL 语法 | RENAME TABLE 旧名 TO 新名 [, 旧名2 TO 新名2] |
|---|---|
| PostgreSQL 语法 | ALTER TABLE 旧名 RENAME TO 新名 |
| 原子性 | MySQL 多表改名单条语句原子完成,可做轻量换表 |
| 权限要求 | 原表相关权限加新表建表等权限 |
| 影响面 | 视图、存储过程、触发器、授权、应用与 ORM 映射 |
典型使用场景
- 换表上线:新表灌好数据后用一条 RENAME 原子换名
- 旧表归档:把历史表改名加时间后缀,保持命名整洁
- 表拆分过渡:先把原表挪成备份名,再挂上新的分表视图
- 命名规范化:修正拼写错误或统一前缀
- 故障回退:改名退回旧表名,比重新建表快得多
MySQL 换名
MySQL 换名
RENAME TABLE orders TO orders_bak, orders_new TO orders; -- 一条语句原子换名
SHOW TABLES LIKE 'orders%'; -- 确认改名结果
-- 换表期间的新写入要双写或短暂停写,避免中间数据落进旧表
-- 回退同样是一条 RENAME TABLE 反向执行PostgreSQL 换名
PostgreSQL 换名
BEGIN;
ALTER TABLE orders RENAME TO orders_bak; -- 事务内可回滚
ALTER TABLE orders_new RENAME TO orders;
COMMIT;
-- 出错就 ROLLBACK,两个改名一起撤销改名后要检查的依赖
| 依赖项 | 改名后的状态 | 处理建议 |
|---|---|---|
| 视图与物化视图 | 定义里仍写旧表名 | 逐个重建或刷新,确认能查到新表 |
| 存储过程与触发器 | 语句文本不会跟着改 | 重新部署带新名的定义 |
| 授权(MySQL) | 授权按表名记录,新名没有权限 | 按新名重新 GRANT;PG 授权绑定对象标识会跟随 |
| 应用与 ORM | SQL、映射文件仍指向旧名 | 改配置并随发版一起上线 |
| 复制过滤规则 | 按旧表名匹配的规则会失效 | 同步调整规则后再观察复制状态 |
线上换表只做 RENAME 会丢中间数据:切换前后的增量写入必须双写或短暂停写,确认新表数据追平后再改名,改完还要继续观察一段时间的写入。
MySQL 跨 schema 改名可以(同一实例内),跨实例不行;RENAME 比「DROP + CREATE + 重新导入」轻得多,失败时整条语句回滚,不留半成品。