このページは機械翻訳したものです。
MERGE テーブルの既知の問題点は次のとおりです。
-
5.1.23 バージョンより前の MySQL Server では、MyISAM の非一時的な子供のテーブルを持つ一時的なマージテーブルを作成できました。
バージョン 5.1.23 からは、MERGE の子供は親のテーブルを介してロックされました。 親が一時的であった場合、親がロックされなかったため、子供もロックされませんでした。 MyISAM テーブルを同時に使用すると、テーブルが破損しました。
ALTER TABLEを使用してMERGEテーブルを別のストレージエンジンに変えると、基礎テーブルへのマッピングが失われます。 その代わり、変更されたテーブルに基礎MyISAMテーブルの行がコピーされ、そのときに、指定されたストレージエンジンを使用します。MERGEテーブルのINSERT_METHODテーブルオプションは、MERGEテーブルへの挿入にどの基礎MyISAMテーブルを使用するかを示します。 ただし、そのMyISAMテーブルにAUTO_INCREMENTテーブルオプションを使用しても、1 つ以上の行がMyISAMテーブルに直接挿入されるまで、MERGEテーブルへの挿入は有効になりません。MERGEテーブルは、テーブル全体に一意制約を保持できません。INSERTを実行すると、データは最初または最後のMyISAMテーブル (INSERT_METHODオプションで指定されます) に入ります。 MySQL は一意のキー値がMyISAMテーブル内で一意のままであることを保証しますが、コレクション内のすべての基礎テーブルには保証しません。-
MERGEエンジンは基本テーブルセットに一意性を適用できないため、REPLACEは期待どおりに機能しません。 次の 2 つの重要な事実があります。REPLACEは、書き込もうとする基礎テーブルでのみ一意キー違反を検出できます (INSERT_METHODオプションで指定されます)。 これはMERGEテーブル自体の違反とは異なります。REPLACEは、一意キー違反を検出すると、書込み先の基礎となるテーブル (つまり、INSERT_METHODオプションで決定された最初または最後のテーブル) の対応する行のみを変更します。
INSERT ... ON DUPLICATE KEY UPDATEについても同様な考慮が適用されます。 MERGEテーブルはパーティション化をサポートしていません。 つまり、MERGEテーブルも、MERGEテーブルの基礎MyISAMテーブルもパーティション化できません。-
開いた
MERGEテーブルにマッピングされたどのテーブルにも、ANALYZE TABLE、REPAIR TABLE、OPTIMIZE TABLE、ALTER TABLE、DROP TABLE、DELETE(WHERE句なし)、またはTRUNCATE TABLEを使用すべきではありません。 そうする場合、MERGEテーブルは引き続き元のテーブルを参照しているため、予期しない結果となる可能性があります。 この問題に対処するには、名前付きの操作を行う前にFLUSH TABLESステートメントを発行することで、確実にMERGEテーブルが開いたままにならないようにします。予期しない結果には、
MERGEテーブルに対する操作でテーブルの破損が報告される可能性があります。 基礎MyISAMテーブルで名前付き操作のあとにこれが発生した場合、破損メッセージは偽りです。 これに対処するには、MyISAMテーブルを変更したあとでFLUSH TABLESステートメントを発行します。 MERGEストレージエンジンのテーブルマッピングは MySQL の上位レイヤーから隠れているので、MERGEテーブルによって使用されているテーブルでのDROP TABLEは Windows では機能しません。 Windows では開いているファイルの削除を許可しないため、最初にすべてのMERGEテーブルをフラッシュするか (FLUSH TABLESを使用します)、テーブルを削除する前にMERGEテーブルを削除する必要があります。MyISAMテーブルとMERGEテーブルの定義は、テーブルにアクセスするときにチェックされます (たとえば、SELECTまたはINSERTステートメントの一部として)。 このチェックは、テーブルの定義と親の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テーブルにマージできません。親の
MERGEテーブルを持つ、異なる行フォーマットの基礎MyISAMテーブルを使用すると、現在失敗することが知られています。 バグ #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テーブルではこれを行うことができます。 -
一時的な
MERGEとしても、非一時的なMERGEテーブルとしても、CREATE ... SELECTでMERGEテーブルを作成できません。 例:CREATE TABLE m1 ... ENGINE=MRG_MYISAM ... SELECT ...;これを試みると、
tbl_nameはBASE TABLEではないというエラーとなります。 あるケースでは、
MERGEと基礎テーブル間でPACK_KEYSテーブルオプション値が異なると、基礎テーブルにCHARまたはBINARYカラムが含まれている場合、予期しない結果になります。 回避策として、ALTER TABLEを使用して、関係するすべてのテーブルのPACK_KEYS値が同じであることを保証します。 (Bug #50646)