RENAME TABLE
tbl_name TO new_tbl_name
[, tbl_name2 TO new_tbl_name2] ...
RENAME TABLE
重命名一个或多个表。您必须对原始表拥有 ALTER
和 DROP
权限,以及对新表拥有 CREATE
和 INSERT
权限。
例如,要将名为 old_table
的表重命名为 new_table
,请使用以下语句
RENAME TABLE old_table TO new_table;
该语句等效于以下 ALTER TABLE
语句
ALTER TABLE old_table RENAME new_table;
RENAME TABLE
与 ALTER TABLE
不同,它可以在单个语句中重命名多个表
RENAME TABLE old_table1 TO new_table1,
old_table2 TO new_table2,
old_table3 TO new_table3;
重命名操作按从左到右的顺序执行。因此,要交换两个表名,请执行以下操作(假设不存在名为 tmp_table
的表)
RENAME TABLE old_table TO tmp_table,
new_table TO old_table,
tmp_table TO new_table;
对表的元数据锁按名称顺序获取,在某些情况下,当多个事务并发执行时,这可能会影响操作结果。请参阅 第 10.11.4 节,“元数据锁定”。
您可以重命名使用 LOCK TABLES
语句锁定的表,前提是它们是使用 WRITE
锁锁定的,或者是在多表重命名操作的早期步骤中重命名 WRITE
锁定的表的产物。例如,这是允许的
LOCK TABLE old_table1 WRITE;
RENAME TABLE old_table1 TO new_table1,
new_table1 TO new_table2;
这是不允许的
LOCK TABLE old_table1 READ;
RENAME TABLE old_table1 TO new_table1,
new_table1 TO new_table2;
在满足事务表锁定条件的情况下,重命名操作会原子地执行;在重命名进行时,没有其他会话可以访问任何表。
如果在 RENAME TABLE
期间发生任何错误,该语句将失败,并且不会进行任何更改。
您可以使用 RENAME TABLE
将表从一个数据库移动到另一个数据库
RENAME TABLE current_db.tbl_name TO other_db.tbl_name;
使用这种方法将所有表从一个数据库移动到另一个数据库实际上相当于重命名数据库(MySQL 没有针对此操作的单个语句),只是原始数据库仍然存在,但没有表。
与 RENAME TABLE
类似,ALTER TABLE ... RENAME
也可用于将表移动到其他数据库。无论使用哪种语句,如果重命名操作将表移动到位于不同文件系统上的数据库,结果的成功与否取决于平台,并取决于用于移动表文件的底层操作系统调用。
如果表具有触发器,尝试将表重命名到其他数据库将失败,并出现 Trigger in wrong schema (ER_TRG_IN_WRONG_SCHEMA
) 错误。
未加密的表可以移动到启用了加密的数据库,反之亦然。但是,如果启用了 table_encryption_privilege_check
变量,则如果表加密设置与默认数据库加密不同,则需要 TABLE_ENCRYPTION_ADMIN
权限。
要重命名 TEMPORARY
表,RENAME TABLE
不起作用。请改用 ALTER TABLE
。
RENAME TABLE
对视图有效,但视图不能重命名到其他数据库。
专门授予重命名表或视图的任何权限都不会迁移到新名称。必须手动更改它们。
RENAME TABLE
会更改内部生成的外部键约束名称和以字符串 “tbl_name
TO new_tbl_name
tbl_name
_ibfk_” 开头的用户定义的外部键约束名称以反映新的表名。 InnoDB
将以字符串 “tbl_name
_ibfk_” 开头的外部键约束名称解释为内部生成的名称。
指向已重命名表的外部键约束名称会自动更新,除非发生冲突,在这种情况下,语句将失败并出现错误。如果重命名的约束名称已存在,则会发生冲突。在这种情况下,您必须删除并重新创建外键才能使其正常工作。
RENAME TABLE
会更改内部生成的和用户定义的以字符串 “tbl_name
TO new_tbl_name
tbl_name
_chk_” 开头的 CHECK
约束名称以反映新的表名。MySQL 将以字符串 “tbl_name
_chk_” 开头的 CHECK
约束名称解释为内部生成的名称。示例
mysql> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`i1` int(11) DEFAULT NULL,
`i2` int(11) DEFAULT NULL,
CONSTRAINT `t1_chk_1` CHECK ((`i1` > 0)),
CONSTRAINT `t1_chk_2` CHECK ((`i2` < 0))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.02 sec)
mysql> RENAME TABLE t1 TO t3;
Query OK, 0 rows affected (0.03 sec)
mysql> SHOW CREATE TABLE t3\G
*************************** 1. row ***************************
Table: t3
Create Table: CREATE TABLE `t3` (
`i1` int(11) DEFAULT NULL,
`i2` int(11) DEFAULT NULL,
CONSTRAINT `t3_chk_1` CHECK ((`i1` > 0)),
CONSTRAINT `t3_chk_2` CHECK ((`i2` < 0))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.01 sec)