文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  MERGE 資料表問題

18.7.2 MERGE 資料表問題

以下是 MERGE 資料表已知的問題

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