Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

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 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;

表的元数据锁定顺序是按名称顺序进行的,这在某些情况下可能会影响操作结果,当多个事务并发执行时。

您可以使用LOCK TABLES 语句锁定表,然后使用RENAME TABLE 语句重命名锁定的表,提供了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 TABLEALTER TABLE ... RENAME 也可以用来将表移到另一个数据库。无论使用哪种语句,如果重命名操作将表移到另一个数据库,该操作的成功取决于操作系统的文件系统调用。

如果表有触发器,尝试将表重命名到另一个数据库将失败,并返回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_开头,后者以字符串tbl_name_ibfk_开头,反映新表名。InnoDB将以字符串tbl_name_ibfk_开头的外键约束名称解释为内部生成的名称。

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

RENAME TABLE tbl_name TO new_tbl_name将内部生成的和用户定义的CHECK约束名称,前者以字符串tbl_name_chk_开头,后者以字符串tbl_name_chk_开头,反映新表名。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)