13.1.33 RENAME TABLE 语句

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

RENAME TABLE重命名一个或多个 table。您必须具有原始 table 的ALTERDROP特权,以及新 table 的CREATEINSERT特权。

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

RENAME TABLE old_table TO new_table;

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

ALTER TABLE old_table RENAME new_table;

ALTER TABLE不同,RENAME TABLE可以在单个语句中重命名多个 table:

RENAME TABLE old_table1 TO new_table1,
             old_table2 TO new_table2,
             old_table3 TO new_table3;

重命名操作从左到右执行。因此,要交换两个 table 名,请执行此操作(假设中间名称为tmp_table的 table 尚不存在):

RENAME TABLE old_table TO tmp_table,
             new_table TO old_table,
             tmp_table TO new_table;

table 上的元数据锁是按名称 Sequences 获取的,在某些情况下,当多个事务同时执行时,操作结果可能会有所不同。参见第 8.11.4 节“元数据锁定”

要执行RENAME TABLE,必须没有活动的事务或被LOCK TABLES锁定的 table。在满足事务 table 锁定条件的情况下,重命名操作是原子完成的;重命名过程中,没有其他会话可以访问任何 table。

如果在RENAME TABLE期间发生任何错误,则该语句将失败并且不会进行任何更改。

您可以使用RENAME TABLE将 table 从一个数据库移动到另一个数据库:

RENAME TABLE current_db.tbl_name TO other_db.tbl_name;

使用此方法实际上将所有 table 从一个数据库移动到另一个数据库,这实际上重命名了该数据库(MySQL 没有单个语句的操作),只是原始数据库 continue 存在(尽管没有 table)。

RENAME TABLE一样,ALTER TABLE ... RENAME也可以用于将 table 移动到其他数据库。无论使用哪种语句,如果重命名操作会将 table 移动到位于不同文件系统上的数据库,则结果的成功是特定于平台的,并且取决于用于移动 table 文件的基础 os 调用。

如果 table 具有触发器,则尝试将 table 重命名为其他数据库失败,并会出现模式错误(ER_TRG_IN_WRONG_SCHEMA)的触发器错误。

要重命名TEMPORARY个 table,RENAME TABLE不起作用。请改用ALTER TABLE

RENAME TABLE适用于视图,但不能将视图重命名为其他数据库。

专门为重命名的 table 或视图授予的任何特权都不会迁移到新名称。必须手动更改它们。

RENAME TABLE tbl_name TO new_tbl_name更改内部生成的外键约束名称和用户定义的外键约束名称,这些名称以字符串“ * tbl_name * ibfk”开头,以反映新的 table 名。 InnoDB将以字符串“ * tbl_name * ibfk”开头的外键约束名称解释为内部生成的名称。

除非存在冲突,否则指向指向重命名 table 的外键约束名称将自动更新,在这种情况下,语句将失败并显示错误。如果重命名的约束名称已经存在,则会发生冲突。在这种情况下,必须删除并重新创建外键才能使其正常运行。