文件首頁
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 參考手冊  /  其他儲存引擎  /  MERGE 儲存引擎

18.7 MERGE 儲存引擎

MERGE 儲存引擎,也稱為 MRG_MyISAM 引擎,是一組相同的 MyISAM 資料表,可以當作一個資料表使用。相同表示所有資料表都具有相同的欄位資料類型和索引資訊。您不能合併欄位順序不同、相應欄位的資料類型不完全相同,或索引順序不同的 MyISAM 資料表。但是,任何或所有 MyISAM 資料表都可以使用 myisampack 壓縮。請參閱第 6.6.6 節,「myisampack — 產生壓縮、唯讀的 MyISAM 資料表」。資料表之間的以下差異並不重要:

  • 對應欄位和索引的名稱可以不同。

  • 資料表、欄位和索引的註解可以不同。

  • 資料表選項,例如 AVG_ROW_LENGTHMAX_ROWSPACK_KEYS,可以不同。

MERGE 資料表的替代方案是分割資料表,它將單一資料表的分割區儲存在不同的檔案中,並使某些操作能更有效率地執行。有關更多資訊,請參閱第 26 章,分割

當您建立 MERGE 資料表時,MySQL 會在磁碟上建立一個 .MRG 檔案,其中包含應合併成一個資料表的基礎 MyISAM 資料表名稱。MERGE 資料表的資料表格式會儲存在 MySQL 資料字典中。基礎資料表不一定要與 MERGE 資料表位於相同的資料庫中。

您可以在 MERGE 資料表上使用 SELECTDELETEUPDATEINSERT。您必須對應到 MERGE 資料表的 MyISAM 資料表具有 SELECTDELETEUPDATE 權限。

注意

使用 MERGE 資料表會產生以下安全性問題:如果使用者有權存取 MyISAM 資料表 t,則該使用者可以建立一個存取 tMERGE 資料表 m。但是,如果隨後撤銷使用者在 t 上的權限,使用者仍然可以透過 m 來存取 t

搭配 MERGE 資料表使用 DROP TABLE 只會刪除 MERGE 規格。基礎資料表不會受到影響。

若要建立 MERGE 資料表,您必須指定 UNION=(資料表清單) 選項,以指示要使用的 MyISAM 資料表。您可以選擇指定 INSERT_METHOD 選項來控制如何將資料插入 MERGE 資料表。使用 FIRSTLAST 的值會分別將資料插入第一個或最後一個基礎資料表。如果您沒有指定 INSERT_METHOD 選項,或使用 NO 的值指定,則不允許將資料插入 MERGE 資料表,並且嘗試這麼做會導致錯誤。

以下範例顯示如何建立 MERGE 資料表:

mysql> CREATE TABLE t1 (
    ->    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->    message CHAR(20)) ENGINE=MyISAM;
mysql> CREATE TABLE t2 (
    ->    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->    message CHAR(20)) ENGINE=MyISAM;
mysql> INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
mysql> INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
mysql> CREATE TABLE total (
    ->    a INT NOT NULL AUTO_INCREMENT,
    ->    message CHAR(20), INDEX(a))
    ->    ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;

欄位 a 在基礎 MyISAM 資料表中以 PRIMARY KEY 建立索引,但在 MERGE 資料表中則否。它在其中已建立索引,但不是以 PRIMARY KEY 建立索引,因為 MERGE 資料表無法對一組基礎資料表強制執行唯一性。(同樣地,在基礎資料表中具有 UNIQUE 索引的欄位應在 MERGE 資料表中建立索引,但不是以 UNIQUE 索引建立。)

建立 MERGE 資料表之後,您可以使用它來發出對整個資料表群組進行操作的查詢:

mysql> SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table   |
| 3 | t1      |
| 1 | Testing |
| 2 | table   |
| 3 | t2      |
+---+---------+

若要將 MERGE 資料表重新對應到不同的 MyISAM 資料表集合,您可以使用下列其中一種方法:

  • DROPMERGE 資料表並重新建立。

  • 使用 ALTER TABLE tbl_name UNION=(...) 來變更基礎資料表的清單。

    也可以使用 ALTER TABLE ... UNION=() (也就是說,使用空的 UNION 子句) 來移除所有基礎資料表。但是,在這種情況下,資料表實際上是空的,並且插入會失敗,因為沒有基礎資料表可以接收新列。此資料表可能適合作為使用 CREATE TABLE ... LIKE 建立新的 MERGE 資料表的範本。

基礎資料表定義和索引必須與 MERGE 資料表的定義密切一致。當開啟屬於 MERGE 資料表一部分的資料表時,會檢查一致性,而不是在建立 MERGE 資料表時。如果任何資料表未通過一致性檢查,則會導致觸發開啟資料表的操作失敗。這表示變更 MERGE 內資料表的定義可能會在存取 MERGE 資料表時導致失敗。套用到每個資料表的一致性檢查如下:

  • 基礎資料表和 MERGE 資料表必須具有相同數量的欄位。

  • 基礎資料表和 MERGE 資料表中的欄位順序必須相符。

  • 此外,會比較父 MERGE 資料表和基礎資料表中每個對應欄位的規格,且必須滿足下列檢查:

    • 基礎資料表和 MERGE 資料表中的欄位類型必須相等。

    • 基礎資料表和 MERGE 資料表中的欄位長度必須相等。

    • 基礎資料表的欄位和 MERGE 資料表可以為 NULL

  • 基礎資料表必須至少具有與 MERGE 資料表一樣多的索引。基礎資料表可能具有比 MERGE 資料表更多的索引,但不能更少。

    注意

    存在已知問題,即相同欄位的索引在 MERGE 資料表和基礎 MyISAM 資料表中必須依相同的順序排列。請參閱錯誤 #33653。

    每個索引都必須滿足下列檢查:

    • 基礎資料表和 MERGE 資料表的索引類型必須相同。

    • 基礎資料表和 MERGE 資料表的索引定義中索引部分(也就是複合索引中的多個欄位)的數量必須相同。

    • 針對每個索引部分:

      • 索引部分長度必須相等。

      • 索引部分類型必須相等。

      • 索引部分語言必須相等。

      • 檢查索引部分是否可以為 NULL

如果 MERGE 表格因為底層表格的問題而無法開啟或使用,CHECK TABLE 會顯示造成問題的表格資訊。

其他資源