文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  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 也可以用來將表格移動到不同的資料庫。無論使用哪個陳述式,如果重新命名操作會將表格移動到位於不同檔案系統上的資料庫,則結果是否成功會因平台而異,並且取決於用於移動表格檔案的底層作業系統呼叫。

如果表格具有觸發程序,則嘗試將表格重新命名到不同的資料庫會失敗,並出現 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)