MERGE
儲存引擎,也稱為 MRG_MyISAM
引擎,是相同 MyISAM
資料表的集合,可以作為一個使用。 「相同」表示所有資料表都具有相同的欄位資料類型和索引資訊。 您無法合併欄位順序不同、對應欄位沒有完全相同的資料類型,或索引順序不同的 MyISAM
資料表。 但是,任何或所有的 MyISAM
資料表都可以使用 myisampack 進行壓縮。 請參閱 第 6.6.6 節,「myisampack — 產生壓縮、唯讀的 MyISAM 資料表」。 資料表之間的差異,例如以下這些,並不重要:
對應欄位和索引的名稱可以不同。
資料表、欄位和索引的註解可以不同。
資料表選項,例如
AVG_ROW_LENGTH
、MAX_ROWS
或PACK_KEYS
可以不同。
MERGE
資料表的替代方案是分割資料表,它將單一資料表的分割區儲存在不同的檔案中,並使某些操作可以更有效率地執行。 有關更多資訊,請參閱 第 26 章,分割。
當您建立 MERGE
資料表時,MySQL 會在磁碟上建立一個 .MRG
檔案,其中包含應該作為一個使用的基礎 MyISAM
資料表的名稱。MERGE
資料表的資料表格式儲存在 MySQL 資料字典中。 基礎資料表不一定與 MERGE
資料表位於相同的資料庫中。
您可以在 MERGE
資料表上使用 SELECT
、DELETE
、UPDATE
和 INSERT
。 您必須對應至 MERGE
資料表的 MyISAM
資料表具有 SELECT
、DELETE
和 UPDATE
權限。
使用 MERGE
資料表會導致以下安全性問題:如果使用者可以存取 MyISAM
資料表 t
,則該使用者可以建立一個存取 t
的 MERGE
資料表 m
。但是,如果隨後撤銷使用者對 t
的權限,使用者仍然可以透過 m
存取 t
。
將 DROP TABLE
與 MERGE
資料表一起使用只會刪除 MERGE
規格。 基礎資料表不受影響。
若要建立 MERGE
資料表,您必須指定一個 UNION=(
選項,以指示要使用哪些 資料表清單
)MyISAM
資料表。 您可以選擇性地指定 INSERT_METHOD
選項,以控制如何將插入項插入 MERGE
資料表。 使用 FIRST
或 LAST
值,使插入項分別插入第一個或最後一個基礎資料表。 如果您未指定 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
會顯示關於哪個表格導致問題的資訊。
其他資源
有一個專門討論
MERGE
儲存引擎的論壇,網址為:https://forums.mysql.com/list.php?93。