文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  MERGE 表格問題

18.7.2 MERGE 表格問題

以下是 MERGE 表格的已知問題:

  • 在 MySQL 伺服器 5.1.23 之前的版本中,可以建立具有非暫時性子 MyISAM 表格的暫時性合併表格。

    從 5.1.23 版本開始,MERGE 子表格會透過父表格鎖定。如果父表格是暫時性的,則不會鎖定,因此子表格也不會被鎖定。平行使用 MyISAM 表格會導致它們損毀。

  • 如果您使用 ALTER TABLEMERGE 表格變更為其他儲存引擎,則會遺失與基礎表格的對應。相反地,基礎 MyISAM 表格中的資料列會複製到變更後的表格中,然後該表格會使用指定的儲存引擎。

  • MERGE 表格的 INSERT_METHOD 表格選項指出要使用哪個基礎 MyISAM 表格來插入到 MERGE 表格中。然而,在至少一個資料列直接插入到 MyISAM 表格之前,該 MyISAM 表格的 AUTO_INCREMENT 表格選項對插入到 MERGE 表格中沒有任何影響。

  • MERGE 表格無法在整個表格上維持唯一性約束。當您執行 INSERT 時,資料會進入第一個或最後一個 MyISAM 表格(由 INSERT_METHOD 選項決定)。MySQL 確保唯一鍵值在該 MyISAM 表格中保持唯一,但不會在集合中的所有基礎表格中保持唯一。

  • 由於 MERGE 引擎無法在基礎表格集合上強制執行唯一性,因此 REPLACE 無法如預期般運作。以下是兩個主要事實:

    • REPLACE 只能偵測到它要寫入的基礎表格中的唯一鍵違規(由 INSERT_METHOD 選項決定)。這與 MERGE 表格本身的違規不同。

    • 如果 REPLACE 偵測到唯一鍵違規,則只會變更它要寫入的基礎表格中對應的資料列;也就是說,由 INSERT_METHOD 選項決定的第一個或最後一個表格。

    類似的考慮因素適用於 INSERT ... ON DUPLICATE KEY UPDATE

  • MERGE 表格不支援分割區。也就是說,您無法分割 MERGE 表格,也不能分割任何 MERGE 表格的基礎 MyISAM 表格。

  • 您不應在任何對應到開啟的 MERGE 表格的表格上使用 ANALYZE TABLEREPAIR TABLEOPTIMIZE TABLEALTER TABLEDROP TABLE、沒有 WHERE 子句的 DELETETRUNCATE TABLE。如果您這樣做,MERGE 表格可能仍然會參照原始表格並產生非預期的結果。為了解決此問題,請確保在執行任何已命名的操作之前,透過發出 FLUSH TABLES 語法來確保沒有 MERGE 表格保持開啟狀態。

    非預期的結果包括 MERGE 表格報告表格損毀的可能性。如果在使用基礎 MyISAM 表格執行上述其中一個已命名的操作後發生這種情況,則損毀訊息是假的。為了處理這種情況,請在修改 MyISAM 表格後發出 FLUSH TABLES 語法。

  • 在 Windows 上對 MERGE 表格正在使用的表格執行 DROP TABLE 將無法運作,因為 MERGE 儲存引擎的表格對應會對 MySQL 的上層隱藏。Windows 不允許刪除開啟的檔案,因此您必須先清空所有 MERGE 表格(使用 FLUSH TABLES)或刪除 MERGE 表格,然後才能刪除該表格。

  • 當表格被存取時(例如,作為 SELECTINSERT 語法的一部分),會檢查 MyISAM 表格和 MERGE 表格的定義。檢查會透過比較資料欄順序、類型、大小和相關索引來確保表格的定義和父 MERGE 表格定義相符。如果表格之間存在差異,則會傳回錯誤且語法會失敗。由於這些檢查會在表格開啟時進行,因此對單一表格定義的任何變更,包括資料欄變更、資料欄排序和引擎變更,都會導致語法失敗。

  • MERGE 表格及其底層表格中,索引的順序應該相同。如果您使用 ALTER TABLEMERGE 表格中使用的表格新增 UNIQUE 索引,然後使用 ALTER TABLEMERGE 表格上新增非唯一索引,如果底層表格中已經存在非唯一索引,則這些表格的索引順序會不同。(這是因為 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

  • 在某些情況下,如果底層表格包含 CHARBINARY 資料行,則 MERGE 和底層表格之間的 PACK_KEYS 表格選項值不同,會導致非預期的結果。作為一種解決方法,請使用 ALTER TABLE 來確保所有相關表格都具有相同的 PACK_KEYS 值。(Bug #50646)