以下是 MERGE 資料表已知的問題
在 5.1.23 之前的 MySQL 伺服器版本中,可以使用非暫時的子 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將UNIQUE索引新增至MERGE資料表中使用的資料表,然後使用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資料表會失敗。請參閱錯誤 #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值。(錯誤 #50646)