文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美國信紙尺寸) - 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 參考手冊  /  替代儲存引擎  /  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

DROP TABLEMERGE 資料表一起使用只會刪除 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 資料表中則否。在 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 資料表集合,您可以使用以下方法之一:

  • DROP MERGE 資料表並重新建立。

  • 使用 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 表格中,相同欄位上的索引必須依相同的順序排列。請參閱 Bug #33653。

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

    • 底層表格和 MERGE 表格的索引類型必須相同。

    • 底層表格和 MERGE 表格的索引定義中,索引組件的數量(即複合索引中的多個欄位)必須相同。

    • 對於每個索引組件:

      • 索引組件長度必須相同。

      • 索引組件類型必須相同。

      • 索引組件語言必須相同。

      • 檢查索引組件是否可以為 NULL

如果因為底層表格的問題而無法開啟或使用 MERGE 表格,CHECK TABLE 會顯示關於哪個表格導致問題的資訊。

其他資源