以下是 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)