RENAME TABLE语句
RENAME TABLE tbl_nameTO new_tbl_name [, tbl_name2TO new_tbl_name2] ...
RENAME TABLE
重命名一个或多个表。您必须具有ALTER
与DROP
原始表的权限,以及CREATE
与INSERT
新表的权限。
例如,重命名一个指定的表old_table
来new_table
,用这个语句:
RENAME TABLE old_tableTO new_table;
该语句等效于以下ALTER TABLE
语句:
ALTER TABLE old_tableRENAME new_table;
RENAME TABLE
与相比ALTER TABLE
,可以在单个语句中重命名多个表:
RENAME TABLE old_table1TO new_table1, old_table2TO new_table2, old_table3TO new_table3;
重命名操作从左到右执行。因此,要交换两个表名,请执行以下操作(假设具有中间名的表tmp_table
尚不存在):
RENAME TABLE old_tableTO tmp_table, new_tableTO old_table, tmp_tableTO new_table;
表上的元数据锁是按名称顺序获取的,在某些情况下,当多个事务同时执行时,操作结果可能会有所不同。请参见“元数据锁定”。
从MySQL 8.0.13开始,您可以重命名使用LOCK TABLES
语句锁定的表,前提是它们已被WRITE
锁锁定,或者是WRITE
从多表重命名操作中的较早步骤重命名已锁定表的产品。例如,这是允许的:
LOCK TABLE old_table1WRITE ;RENAME TABLE old_table1TO new_table1, new_table1TO new_table2;
这是不允许的:
LOCK TABLE old_table1READ ;RENAME TABLE old_table1TO new_table1, new_table1TO new_table2;
在MySQL 8.0.13之前,要执行RENAME TABLE
,必须没有用锁定的表LOCK TABLES
。
在满足事务表锁定条件的情况下,重命名操作是原子完成的;重命名过程中,没有其他会话可以访问任何表。
如果在期间发生任何错误RENAME TABLE
,则该语句将失败,并且不会进行任何更改。
您可以RENAME TABLE
用来将表从一个数据库移动到另一个数据库:
RENAME TABLE current_db.tbl_nameTO other_db.tbl_name;
使用此方法实际上将所有表从一个数据库移动到另一个数据库,这实际上重命名了该数据库(MySQL没有单个语句的操作),只是原始数据库继续存在(尽管没有表)。
像一样RENAME TABLE
,ALTER 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_ ”,以反映新表名。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 t1TO 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)