MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

このページは機械翻訳したものです。

16.7 MERGE ストレージエンジン

MRG_MyISAM エンジンとしても知られている MERGE ストレージエンジンは、1 つのテーブルとして使用できる同一の MyISAM テーブルの集まりです。 「同一」は、すべてのテーブルのカラムデータ型とインデックス情報が同一であることを意味します。 カラムが異なる順序でリストされている MyISAM テーブル、対応するカラムにまったく同じデータ型がない MyISAM テーブル、またはインデックスが異なる順序である MyISAM テーブルはマージできません。 しかし、MyISAM テーブルのすべてまたはいずれかを myisampack で圧縮できます。 セクション4.6.6「myisampack — 圧縮された読み取り専用の MyISAM テーブルの生成」を参照してください。 次のようなテーブルの違いは関係ありません:

MERGE テーブルのかわりにパーティションテーブルを使用すると、単一のテーブルのパーティションを別々のファイルに格納し、一部の操作をより効率的に実行できます。 詳細については、第24章「パーティション化を参照してください。

MERGE テーブルを作成すると、MySQL によって、基礎となる MyISAM テーブルの名前を含む .MRG ファイルがディスク上に作成されます。 MERGE テーブルのテーブル形式は、MySQL データディクショナリに格納されます。 基礎となるテーブルは、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;

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

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

追加のリソース