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;
資料表的中繼資料鎖定會依名稱順序取得,這在某些情況下,當多個交易同時執行時,可能會影響操作結果。請參閱 第 10.11.4 節,「中繼資料鎖定」。
您可以重新命名使用 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;
在滿足交易資料表鎖定條件後,重新命名作業會以原子方式完成;在重新命名進行時,其他任何連線都無法存取任何資料表。
如果在 RENAME TABLE
期間發生任何錯誤,則語法會失敗,且不會進行任何變更。
您可以使用 RENAME TABLE
將資料表從一個資料庫移動到另一個資料庫。
RENAME TABLE current_db.tbl_name TO 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 會將以字串 「tbl_name
_chk_」 開頭的 CHECK
限制名稱解譯為內部產生的名稱。範例:
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)