以下是 MERGE
表格的已知問題:
在 MySQL 伺服器 5.1.23 之前的版本中,可以建立具有非暫時性子 MyISAM 表格的暫時性合併表格。
從 5.1.23 版本開始,MERGE 子表格會透過父表格鎖定。如果父表格是暫時性的,則不會鎖定,因此子表格也不會被鎖定。平行使用 MyISAM 表格會導致它們損毀。
如果您使用
ALTER TABLE
將MERGE
表格變更為其他儲存引擎,則會遺失與基礎表格的對應。相反地,基礎MyISAM
表格中的資料列會複製到變更後的表格中,然後該表格會使用指定的儲存引擎。MERGE
表格的INSERT_METHOD
表格選項指出要使用哪個基礎MyISAM
表格來插入到MERGE
表格中。然而,在至少一個資料列直接插入到MyISAM
表格之前,該MyISAM
表格的AUTO_INCREMENT
表格選項對插入到MERGE
表格中沒有任何影響。MERGE
表格無法在整個表格上維持唯一性約束。當您執行INSERT
時,資料會進入第一個或最後一個MyISAM
表格(由INSERT_METHOD
選項決定)。MySQL 確保唯一鍵值在該MyISAM
表格中保持唯一,但不會在集合中的所有基礎表格中保持唯一。由於
MERGE
引擎無法在基礎表格集合上強制執行唯一性,因此REPLACE
無法如預期般運作。以下是兩個主要事實:類似的考慮因素適用於
INSERT ... ON DUPLICATE KEY UPDATE
。MERGE
表格不支援分割區。也就是說,您無法分割MERGE
表格,也不能分割任何MERGE
表格的基礎MyISAM
表格。您不應在任何對應到開啟的
MERGE
表格的表格上使用ANALYZE TABLE
、REPAIR TABLE
、OPTIMIZE TABLE
、ALTER TABLE
、DROP TABLE
、沒有WHERE
子句的DELETE
或TRUNCATE TABLE
。如果您這樣做,MERGE
表格可能仍然會參照原始表格並產生非預期的結果。為了解決此問題,請確保在執行任何已命名的操作之前,透過發出FLUSH TABLES
語法來確保沒有MERGE
表格保持開啟狀態。非預期的結果包括
MERGE
表格報告表格損毀的可能性。如果在使用基礎MyISAM
表格執行上述其中一個已命名的操作後發生這種情況,則損毀訊息是假的。為了處理這種情況,請在修改MyISAM
表格後發出FLUSH TABLES
語法。在 Windows 上對
MERGE
表格正在使用的表格執行DROP TABLE
將無法運作,因為MERGE
儲存引擎的表格對應會對 MySQL 的上層隱藏。Windows 不允許刪除開啟的檔案,因此您必須先清空所有MERGE
表格(使用FLUSH TABLES
)或刪除MERGE
表格,然後才能刪除該表格。當表格被存取時(例如,作為
SELECT
或INSERT
語法的一部分),會檢查MyISAM
表格和MERGE
表格的定義。檢查會透過比較資料欄順序、類型、大小和相關索引來確保表格的定義和父MERGE
表格定義相符。如果表格之間存在差異,則會傳回錯誤且語法會失敗。由於這些檢查會在表格開啟時進行,因此對單一表格定義的任何變更,包括資料欄變更、資料欄排序和引擎變更,都會導致語法失敗。在
MERGE
表格及其底層表格中,索引的順序應該相同。如果您使用ALTER TABLE
在MERGE
表格中使用的表格新增UNIQUE
索引,然後使用ALTER TABLE
在MERGE
表格上新增非唯一索引,如果底層表格中已經存在非唯一索引,則這些表格的索引順序會不同。(這是因為ALTER TABLE
會將UNIQUE
索引放在非唯一索引之前,以便快速偵測重複鍵。)因此,對具有此類索引的表格進行查詢時,可能會返回非預期的結果。如果您遇到類似 ERROR 1017 (HY000): Can't find file: '
tbl_name
.MRG' (errno: 2) 的錯誤訊息,通常表示某些底層表格未使用MyISAM
儲存引擎。請確認所有這些表格都是MyISAM
。MERGE
表格中的最大行數為 264 (~1.844E+19;與MyISAM
表格相同)。不可能將多個MyISAM
表格合併到一個單一的MERGE
表格中,使其擁有的行數超過此限制。已知目前將具有不同行格式的底層
MyISAM
表格與父MERGE
表格一起使用會失敗。請參閱 Bug #32364。當
LOCK TABLES
生效時,您無法變更非暫時性MERGE
表格的聯合清單。以下操作不會有效CREATE TABLE m1 ... ENGINE=MRG_MYISAM ...; LOCK TABLES t1 WRITE, t2 WRITE, m1 WRITE; ALTER TABLE m1 ... UNION=(t1,t2) ...;
但是,您可以使用暫時性
MERGE
表格來執行此操作。您無法使用
CREATE ... SELECT
建立MERGE
表格,無論是作為暫時性MERGE
表格還是非暫時性MERGE
表格。例如CREATE TABLE m1 ... ENGINE=MRG_MYISAM ... SELECT ...;
嘗試執行此操作會產生錯誤:
tbl_name
不是BASE TABLE
。在某些情況下,如果底層表格包含
CHAR
或BINARY
資料行,則MERGE
和底層表格之間的PACK_KEYS
表格選項值不同,會導致非預期的結果。作為一種解決方法,請使用ALTER TABLE
來確保所有相關表格都具有相同的PACK_KEYS
值。(Bug #50646)