Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


15.7 MERGE ストレージエンジン

MRG_MyISAM エンジンとしても知られている MERGE ストレージエンジンは、1 つのテーブルとして使用できる同一の MyISAM テーブルの集まりです。同一のというのは、すべてのテーブルが同一のカラムとインデックス情報を持つという意味です。カラムが異なる順番でリストされていたり、完全に同じカラムでなかったり、インデックスの順番が違っていたりすると MyISAM テーブルをマージできません。しかし、MyISAM テーブルのすべてまたはいずれかを myisampack で圧縮できます。セクション4.6.5「myisampack — 圧縮された読み取り専用の MyISAM テーブルの生成」を参照してください。AVG_ROW_LENGTHMAX_ROWSPACK_KEYS などのテーブルオプションの違いは問題ではありません。

MERGE テーブルに代わるものはパーティション化されたテーブルであり、1 つのテーブルのパーティションを別々のファイルに格納します。パーティション化によって、一部の操作がより効率的に実行でき、MyISAM ストレージエンジンに制限されません。詳細については、第19章「パーティション化を参照してください。

MERGE テーブルを作成するときに、MySQL はディスク上に 2 つファイルを作成します。そのファイル名はテーブル名で始まり、ファイルタイプを示す拡張子が付きます。.frm ファイルはテーブルフォーマットを格納し、.MRG ファイルは 1 つのテーブルとして使用すべき基礎 MyISAM テーブル名を含みます。これらのテーブルは、MERGE テーブルと同じデータベースにある必要はありません。

MERGE テーブルでは、SELECTDELETEUPDATE、および INSERT を使用できます。MERGE テーブルにマッピングする MyISAM テーブルに対して SELECTDELETE、および UPDATE 権限が必要です。

注記

MERGE テーブルの利用は、次のセキュリティーに関する問題を引き起こします。ユーザーが MyISAM テーブル t に対するアクセス権限を持っていると、そのユーザーは t にアクセスできる MERGE テーブル m を作成できます。しかし、t に対するユーザーの権限があとで破棄された場合、ユーザーは m を介してアクセスすることで t にアクセスを続けることができます。

DROP TABLEMERGE テーブルに使用すると、MERGE 指定だけが削除されます。基礎テーブルは影響を受けません。

MERGE テーブルを作成するには、どの MyISAM テーブルを使用するかを示す UNION=(list-of-tables) オプションを指定する必要があります。オプションとして、INSERT_METHOD オプションを指定して MERGE テーブルへの挿入方法を制御できます。FIRST または LAST の値を使用すると、それぞれ最初のまたは最後の基礎テーブルで挿入が実行されることになります。INSERT_METHOD オプションを指定しないか、または値 NO 付きでこのオプションを指定すると、MERGE テーブルへの挿入は許可されず、挿入の試みはエラーとなります。

次の例は、MERGE テーブルの作成方法を紹介しています。

mysql> CREATE TABLE t1 (
    ->    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->    message CHAR(20)) ENGINE=MyISAM;
mysql> CREATE TABLE t2 (
    ->    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->    message CHAR(20)) ENGINE=MyISAM;
mysql> INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
mysql> INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
mysql> CREATE TABLE total (
    ->    a INT NOT NULL AUTO_INCREMENT,
    ->    message CHAR(20), INDEX(a))
    ->    ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;

カラム aPRIMARY KEY として基礎 MyISAM テーブルではインデックスが付けられていますが、MERGE テーブルではインデックスが付けられていません。MERGE テーブルは基礎テーブルセットに一意性を適用できないため、インデックスは設定されますが、PRIMARY KEY としては設定されません。(同様に、基礎テーブルで UNIQUE インデックスを持つカラムには、MERGE テーブルでインデックスが付けられますが、UNIQUE インデックスとしては付けられないはずです。)

MERGE テーブルを作成したあと、このテーブルを使用して、テーブルのグループにまとめて操作を行うクエリーを発行できます。

mysql> SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table   |
| 3 | t1      |
| 1 | Testing |
| 2 | table   |
| 3 | t2      |
+---+---------+

MERGE テーブルを MyISAM テーブルの別のコレクションに対して再マッピングするには、次のいずれかの方法を利用できます。

  • MERGE テーブルを DROP して、再作成する。

  • 基礎テーブルのリストを変更するために、ALTER TABLE tbl_name UNION=(...) を利用する。

    ALTER TABLE ... UNION=() (つまり、空の UNION 句) を使用してすべての基礎テーブルを削除することもできます。ただしこの場合、テーブルは実質的には空であり、新しい行を取得する基礎テーブルがないために挿入は失敗します。このようなテーブルは、新しい MERGE テーブルを CREATE TABLE ... LIKE で作成するためのテンプレートとして役立つ場合があります。

基礎テーブルの定義とインデックスは、MERGE テーブルの定義と厳密に一致する必要があります。一致がチェックされるのは、MERGE テーブルが作成されたときではなく、MERGE テーブルの一部のテーブルが開いたときです。いずれのテーブルも一致チェックに失敗した場合、テーブルのオープンをトリガーした操作は失敗します。すなわち、MERGE 内のテーブルの定義を変更すると、MERGE テーブルがアクセスされたときに失敗の原因となる可能性があります。それぞれのテーブルに適用される一致チェックは次のとおりです。

  • 基礎テーブルと MERGE テーブルのカラム数は同じでなければいけません。

  • 基礎テーブルと MERGE テーブルのカラムの順番は一致する必要があります。

  • また、親の MERGE テーブル内の対応する各カラムの指定と基礎テーブルの指定を比較して、次のチェック内容を満たす必要があります。

    • 基礎テーブルと MERGE テーブルのカラムの型は一致する必要がある。

    • 基礎テーブルと MERGE テーブルのカラムの長さは一致する必要がある。

    • 基礎テーブルと MERGE テーブルのカラムは NULL でもかまわない。

  • 基礎テーブルは、少なくとも MERGE テーブルと同じ数のインデックスを持つ必要がある。基礎テーブルのインデックスの数は MERGE テーブルより多くてもかまわないが、少なくすることはできない。

    注記

    同じカラムのインデックスは、MERGE テーブルと基礎 MyISAM テーブルの両方でまったく同じ順番でなければならないという、既知の問題が存在します。バグ #33653 を参照してください。

    各インデックスは次のチェック内容を満たす必要があります。

    • 基礎テーブルと MERGE テーブルのインデックスの型は一致する必要がある。

    • 基礎テーブルと MERGE テーブルのインデックス定義でのインデックス部の数 (すなわち、複合インデックス内に複数のカラム) は一致する必要があります。

    • 各インデックス部について。

      • インデックス部の長さは同じでなければいけない。

      • インデックス部の型は同じでなければいけない。

      • インデックス部の言語は同じでなければいけない。

      • インデックス部が NULL でかまわないかどうかをチェックする。

MERGE テーブルが基礎テーブルの問題のために、開いたり使用したりできない場合、CHECK TABLE は問題の原因となったテーブルに関する情報を表示します。

追加のリソース