文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  RENAME TABLE 语句

15.1.36 RENAME TABLE 语句

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

RENAME TABLE 重命名一个或多个表。您必须对原始表拥有 ALTERDROP 权限,以及对新表拥有 CREATEINSERT 权限。

例如,要将名为 old_table 的表重命名为 new_table,请使用以下语句

RENAME TABLE old_table TO new_table;

该语句等效于以下 ALTER TABLE 语句

ALTER TABLE old_table RENAME new_table;

RENAME TABLEALTER 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)