MySQL的SQL語句 - 數據定義語句(18)- RENAME TABLE 語句

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)
相關文章
相關標籤/搜索