既に分かっている MERGE
テーブルの問題点は次のような物です。
MERGE
テーブルを別のストレージエンジンに変える為に、ALTER
TABLE
テーブルを利用すると、基礎となるテーブルへの位置付けが失われます。その代わりに、基礎となる
MyISAM
テーブルのレコードが変化したテーブルにコピーされ、そしてそれは指定されたストレージエンジンを利用します。
REPLACE
は機能しません。
MERGE
テーブルは領域確保をサポートしません。これは、MERGE
テーブルも、MERGE
テーブルの基礎となる MyISAM
テーブルも領域確保ができないという事です。
開いているMERGE
テーブルにマップされた全てのテーブルに対して、
WHERE
条項、 REPAIR
TABLE
、 TRUNCATE TABLE
、
OPTIMIZE TABLE
、また ANALYZE
TABLE
がない DROP TABLE
、
ALTER TABLE
、
DELETE
を使う事はできません。それをすると
MERGE
テーブルは元のテーブルを参照する事があるので、好ましくない結果をもたらす可能性があります。このような事を防ぐのに一番簡単なのは、FLUSH
TABLES
ステートメントを事前に発行する事によって、全ての
MERGE
テーブルを閉じておくという方法です。
MERGE
ストレージエンジンのテーブル位置づけはMySQLの上位レイヤーから隠れているので、MERGE
テーブルによって使用されているDROP
TABLE
はWindowsでは機能しません。Windowsでは開いているファイルを削除する事はできないので、まず
MERGE
テーブルをフラッシュするか( FLUSH
TABLES
を使う)、テーブルをドロップする前にMERGE
テーブルをドロップする必要があります。
MERGE
テーブルは、そのテーブル全体に対して一意性制約を保持する事ができません。
INSERT
を行う時、データは最初、または最後の
MyISAM
テーブルに入ります。(
INSERT_METHOD
オプションの値による。)MySQLは MyISAM
テーブルの中では一意の値はそのまま残る事を保障しますが、全てのテーブルのコレクションの中ではそうではありません。
MySQL
5.1.15以降のバージョンでは、アクセスされた時にMyISAM
テーブルと MERGE
テーブルの定義が確認されます。(例
SELECT
か INSERT
ステートメントの一部として)。そのように確認する事によって、テーブル定義と親MERGE
テーブル定義がカラムの順番、タイプ、サイズ、そして関連するインデックスなどに関して一致する事を保障します。テーブル間で違いがあれば、エラーが発生し、ステートメントは失敗します。
テーブルが開かれた時にこのようなチェックが行われるので、カラム変更、カラムの順番やエンジンの入れ替え等を含む定義の変更によってステートメントが失敗します。
MySQL 5.1.14 とそれ以前のバージョンにて
MERGE
テーブルを修正、または作成する時、基礎となるテーブルがMyISAM
テーブル内に存在し、それらが同一の構造である事を保証する為の確認は行われません。MERGE
テーブルが使用される時、MySQL
は全てのマップされたテーブルの行の長さが等しいかどうかを確認しますが、これは絶対間違いの無い物ではありません。異なるMyISAM
テーブルから
MERGE
テーブルを作成すると、未知の問題に直面する可能性が高いです。
同じように、MyISAM
テーブル以外から MERGE
テーブルを作成したり、または基礎となるテーブルをMyISAM
テーブル以外にドロップしたり変更したりすると、後でMERGE
テーブルを使用する時までエラーは発生しません。
基礎となる MyISAM
テーブルは、MERGE
テーブルが作成される時には存在する必要がないので、全ての基礎となるテーブルが配置されるまでMERGE
テーブルを使用しなければ、テーブルをどんな順番で作成しても構いません。また、
MERGE
テーブルが与えられた時間内に使用されない事を保障できるのであれば、基礎となるテーブルのバックアップ、リストア、変更、ドロップ、または再作成などのメンテナンスを行う事ができます。基礎となるテーブルに対して作業を行っている間に、それらを除外する為に
MERGE
テーブルを一時的に再定義する必要はありません。
MERGE
テーブル内と、その基礎となるテーブルのインデックスの順番は同一でなければいけません。もしMERGE
テーブル内で使われるテーブルにUNIQUE
インデックスを追加する為にALTER
TABLE
を使用し、またMERGE
テーブルに一意ではないインデックスを追加するためにALTER
TABLE
を利用するなら、基礎となるテーブルの中に既に一意ではないインデックスがあれば、テーブルのインデックス順は異なります。(これは、
重複キーの速やかな検出を促進する為にALTER
TABLE
が UNIQUE
インデックスを一意でないインデックスの前に置くからです。)その結果、そのようなインデックスを持つテーブルに対するクエリは予想外の結果をもたらします。
もし ERROR 1017 (HY000): Can't find file:
'
と同じようなエラーメッセージが出たら、それは通常いくつかのベーステーブルがMyISAMストレージエンジンを使用していない事を表します。全てのテーブルがMyISAMである事を確認してください。
mm
.MRG' (errno:
2)
MyISAM
にもあるように、MERGE
テーブルにも232
(~4.295E+09)行の制限があります。その為、この制限を越える複数のMyISAM
テーブルをマージする事はできません。しかし、
MySQLを --with-big-tables
オプションで作成すると、行の制限は
(232)2
(1.844E+19)
行に増加します。詳しくは項2.9.2. 「典型的な configure オプション」を参照してください。MySQL
5.0.4バージョンより、全ての標準バイナリはこのオプションで作成されます。