MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む
このページは機械翻訳したものです。
MRG_MyISAM エンジンとしても知られている MERGE ストレージエンジンは、1 つのテーブルとして使用できる同一の MyISAM テーブルの集まりです。 「「同一」」は、すべてのテーブルのカラムデータ型とインデックス情報が同一であることを意味します。 カラムが異なる順序でリストされている MyISAM テーブル、対応するカラムにまったく同じデータ型がない MyISAM テーブル、またはインデックスが異なる順序である MyISAM テーブルはマージできません。 しかし、MyISAM テーブルのすべてまたはいずれかを myisampack で圧縮できます。 セクション4.6.6「myisampack — 圧縮された読み取り専用の MyISAM テーブルの生成」を参照してください。 次のようなテーブルの違いは関係ありません:
対応するカラムおよびインデックスの名前は異なる場合があります。
テーブル、カラムおよびインデックスのコメントは異なる場合があります。
AVG_ROW_LENGTH、MAX_ROWS、PACK_KEYS などのテーブルオプションは異なる場合があります。
MERGE テーブルのかわりにパーティションテーブルを使用すると、単一のテーブルのパーティションを別々のファイルに格納し、一部の操作をより効率的に実行できます。 詳細については、第24章「パーティション化」を参照してください。
MERGE テーブルを作成すると、MySQL によって、基礎となる MyISAM テーブルの名前を含む .MRG ファイルがディスク上に作成されます。 MERGE テーブルのテーブル形式は、MySQL データディクショナリに格納されます。 基礎となるテーブルは、MERGE テーブルと同じデータベース内にある必要はありません。
MERGE テーブルでは、SELECT、DELETE、UPDATE、および INSERT を使用できます。 MERGE テーブルにマッピングする MyISAM テーブルに対して SELECT、DELETE、および UPDATE 権限が必要です。
MERGE テーブルの利用は、次のセキュリティーに関する問題を引き起こします。ユーザーが MyISAM テーブル t に対するアクセス権限を持っていると、そのユーザーは t にアクセスできる MERGE テーブル m を作成できます。 しかし、t に対するユーザーの権限があとで破棄された場合、ユーザーは m を介してアクセスすることで t にアクセスを続けることができます。
DROP TABLE を MERGE テーブルに使用すると、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 テーブルを 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 は問題の原因となったテーブルに関する情報を表示します。
MERGE ストレージエンジンに特化したフォーラムは、https://forums.mysql.com/list.php?93で参照できます。