Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  RENAME TABLE Statement

15.1.36 重命名表语句

RENAME TABLE
    tbl_name TO new_tbl_name
    [, tbl_name2 TO new_tbl_name2] ...

重命名表 重命名一个或多个表。你必须拥有 ALTERDROP 权限对于原始表,并拥有 CREATEINSERT 权限对于新表。

例如,要重命名一个名为 old_table 的表为 new_table,使用以下语句:

RENAME TABLE old_table TO new_table;

该语句等同于以下 ALTER TABLE 语句:

ALTER TABLE old_table RENAME new_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 current_db.tbl_name TO other_db.tbl_name;

使用这种方法将所有表从一个数据库移到另一个数据库,实际上是重命名数据库(MySQL 没有单个语句来执行此操作),除了原始数据库继续存在,但没有表。

重命名表 一样,ALTER TABLE ... RENAME 也可以用于将表移到另一个数据库。不管使用哪个语句,如果重命名操作将表移到位于不同文件系统上的数据库,操作的成功取决于底层操作系统调用来移动表文件。

如果表具有触发器,尝试将表重命名到另一个数据库将失败,出现 触发器在错误模式 (ER_TRG_IN_WRONG_SCHEMA) 错误。

未加密的表可以移到启用加密的数据库,反之亦然。但是,如果 table_encryption_privilege_check 变量启用了,那么如果表加密设置不同于默认数据库加密设置,需要 TABLE_ENCRYPTION_ADMIN 权限。

要重命名 TEMPORARY 表,不可以使用 重命名表。使用 ALTER TABLE 语句代替。

重命名表 适用于视图,除了视图不能重命名到另一个数据库。

授予特定表或视图的权限不会被迁移到新名称。它们必须手动更改。

重命名表 tbl_name TO new_tbl_name 更改内部生成的外键约束名称和以字符串 tbl_name_ibfk_ 开头的用户定义外键约束名称。InnoDB 将外键约束名称解释为内部生成的名称,以字符串 tbl_name_ibfk_ 开头。

指向重命名表的外键约束名称将自动更新,除非存在冲突,在这种情况下,语句将失败并返回错误。冲突发生在重命名的约束名称已经存在的情况下。在这种情况下,您必须删除并重新创建外键,以便它们能够正常工作。

RENAME TABLE tbl_name TO new_tbl_name 将内部生成和用户定义的 CHECK 约束名称更改为以字符串 tbl_name_chk_ 开头,以反映新的表名称。MySQL 将 CHECK 约束名称解释为以字符串 tbl_name_chk_ 开头的内部生成名称。示例:

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)