このセクションでは、MySQL が CREATE TABLE ... SELECT
ステートメントを複製する方法について説明します。
MySQL 5.6 は、CREATE TABLE ... SELECT
ステートメントが、このステートメントで作成されたテーブル以外のテーブルで変更を行うことを許可しません。これは、以前のバージョンの MySQL (これらのステートメントがそうすることを許可していました) からの動作の変更です。これは、MySQL 5.6 以降のスレーブと前のバージョンの MySQL を実行しているマスターとの間でステートメントベースレプリケーションを使用するときに、マスター上のほかのテーブルで変更を行う CREATE TABLE ... SELECT
ステートメントがスレーブ上で失敗し、レプリケーションが停止することを意味します。これが発生しないようにするには、行ベースレプリケーションを使用するか、問題のステートメントをマスター上で実行する前に書き直すか、マスターを MySQL 5.6 (以降) にアップグレードしてください。(マスターをアップグレードすることを選択する場合、このような CREATE TABLE ... SELECT
ステートメントは、ほかのテーブルでの副作用をなくすように書き直さないかぎり、アップグレード後に失敗することに留意してください。)これは、行ベースのプリケーションを使用するときは問題になりません。このステートメントのログが、CREATE TABLE ... SELECT
全体としてではなく、CREATE TABLE
ステートメントとして記録される (テーブルデータへの変更のログが行挿入イベントとして記録される) ためです。
これらの動作は MySQL バージョンに依存しません。
CREATE TABLE ... SELECT
は常に暗黙的コミットを実行します (セクション13.3.3「暗黙的なコミットを発生させるステートメント」)。-
目的のテーブルが存在しない場合、ロギングは次のように発生します。
IF NOT EXISTS
が存在するかどうかは重要ではありません。STATEMENT
またはMIXED
形式: ステートメントは、書き込まれたものとしてログに記録されます。ROW
形式: ステートメントは、CREATE TABLE
ステートメントおよび一連の行挿入イベントとしてログに記録されます。
ステートメントが失敗した場合、ログは記録されません。これには、宛先テーブルが存在し、
IF NOT EXISTS
が指定されていないケースが含まれます。
宛先テーブルが存在し、IF NOT EXISTS
が指定されているときは、MySQL はバージョンに依存する方法でステートメントを処理します。
5.1.51 より前の MySQL 5.1 および 5.5.6 より前の MySQL 5.5 で (これがオリジナルの動作です):
STATEMENT
またはMIXED
形式: ステートメントは、書き込まれたものとしてログに記録されます。ROW
形式: ステートメントは、CREATE TABLE
ステートメントおよび一連の行挿入イベントとしてログに記録されます。
5.1.51 以降の MySQL 5.1 で:
STATEMENT
またはMIXED
形式: ステートメントは、CREATE TABLE
およびINSERT INTO ... SELECT
ステートメントの同等ペアとしてログに記録されます。ROW
形式: ステートメントは、CREATE TABLE
ステートメントおよび一連の行挿入イベントとしてログに記録されます。
5.5.6 以降の MySQL 5.5 で:
何も挿入されず、ログが記録されません。
これらのバージョン依存が発生するのは、MySQL 5.5.6 で、目的のテーブルがすでに存在する場合に行を挿入しないように CREATE TABLE ... SELECT
の処理が変更されたことと、MySQL 5.1.51 で、このようなステートメントを 5.1 マスターから 5.5 スレーブに複製する際の上位互換性を保持するように変更されたことによります。詳細については、セクション13.1.17.1「CREATE TABLE ... SELECT 構文」を参照してください。