• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • RENAME TABLE语句

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

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

    例如,重命名一个指定的表old_tablenew_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;
    

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

    从MySQL 8.0.13开始,您可以重命名使用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;
    

    在MySQL 8.0.13之前,要执行RENAME TABLE,必须没有用锁定的表LOCK TABLES

    在满足事务表锁定条件的情况下,重命名操作是原子完成的;重命名过程中,没有其他会话可以访问任何表。

    如果在期间发生任何错误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_ ”,以反映新表名。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)