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で参照できます。