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
。
搭配 MERGE
資料表使用 DROP TABLE
只會刪除 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
資料表中則否。它在其中已建立索引,但不是以 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
資料表中必須依相同的順序排列。請參閱錯誤 #33653。每個索引都必須滿足下列檢查:
基礎資料表和
MERGE
資料表的索引類型必須相同。基礎資料表和
MERGE
資料表的索引定義中索引部分(也就是複合索引中的多個欄位)的數量必須相同。針對每個索引部分:
索引部分長度必須相等。
索引部分類型必須相等。
索引部分語言必須相等。
檢查索引部分是否可以為
NULL
。
如果 MERGE
表格因為底層表格的問題而無法開啟或使用,CHECK TABLE
會顯示造成問題的表格資訊。
其他資源
專門討論
MERGE
儲存引擎的論壇位於 https://forums.mysql.com/list.php?93。