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
也可以用來將表格移動到不同的資料庫。無論使用哪個陳述式,如果重新命名操作會將表格移動到位於不同檔案系統上的資料庫,則結果是否成功會因平台而異,並且取決於用於移動表格檔案的底層作業系統呼叫。
如果表格具有觸發程序,則嘗試將表格重新命名到不同的資料庫會失敗,並出現 Trigger in wrong schema (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)