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