RENAME TABLE 語句
RENAME TABLE tbl_name TO new_tbl_name [, tbl_name2 TO new_tbl_name2] ...
RENAME TABLE 語句重命名一個或多個表。對於原始表,必須具備 ALTER和 DROP 權限,對於新表,必須具備 CREATE 和 INSERT 權限。
例如,要將一個名爲 old_table 的表重命名爲 new_table,可使用如下語句:
RENAME TABLE old_table TO new_table;
該語句等價於下面的 ALTER TABLE 語句:
ALTER TABLE old_table RENAME new_table;
與 ALTER TABLE 不一樣,RENAME 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 TABLE, ALTER TABLE ... RENAME 也能夠用於將表移動到另外一個數據庫。無論使用哪一個語句,若是重命名操做將表移動到位於不一樣文件系統上的數據庫中,結果的成功與否取決於平臺,以及用於移動表文件的底層操做系統調用。
若是表有觸發器,嘗試將表重命名到另外一個數據庫將會失敗,報錯信息爲:Trigger in wrong schema (ER_TRG_IN_WRONG_SCHEMA)。
能夠將未加密的表移動到支持加密的數據庫中,反之亦然。可是,若是啓用了 table_encryption_privilege_check 變量,若是表加密設置與默認的數據庫加密不一樣,則須要 TABLE_ENCRYPTION_ADMIN 權限。
要重命名臨時表,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: t1Create 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_ci1 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: t3Create 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_ci1 row in set (0.01 sec)