文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  RENAME TABLE 陳述式

15.1.36 RENAME TABLE 陳述式

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

RENAME TABLE 會重新命名一或多個資料表。您必須對原始資料表擁有 ALTERDROP 權限,且對新資料表擁有 CREATEINSERT 權限。

例如,要將名為 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)