オンライン DDL が導入される前は、多くの DDL 操作を 1 つの ALTER TABLE
ステートメントに結合することが一般的な習慣でした。 各 ALTER TABLE
ステートメントにはテーブルのコピーと再構築が含まれていたため、テーブルに対するすべての変更を 1 回の再構築操作で実行できたことから、同じテーブルへのいくつかの変更を一度に行う方が効率的でした。 マイナス面としては、DDL 操作に関連する SQL コードが保守しにくく、別のスクリプトでの再利用も難しい点がありました。 特定の変更が毎回異なっていたとすると、少し異なるシナリオごとに、新しい複雑な ALTER TABLE
の構築が必要になる可能性があります。
オンラインで実行できる DDL 操作の場合は、効率を犠牲にすることなく、スクリプトおよびメンテナンスを容易にするために個々の ALTER TABLE
ステートメントに分割できます。 たとえば、次のような複雑なステートメントを取り上げ、
ALTER TABLE t1 ADD INDEX i1(c1), ADD UNIQUE INDEX i2(c2),
CHANGE c4_old_name c4_new_name INTEGER UNSIGNED;
それを独立してテストおよび実行できる、次のようなより簡単な部分に分解することができます。
ALTER TABLE t1 ADD INDEX i1(c1);
ALTER TABLE t1 ADD UNIQUE INDEX i2(c2);
ALTER TABLE t1 CHANGE c4_old_name c4_new_name INTEGER UNSIGNED NOT NULL;
複数の部分からなる ALTER TABLE
ステートメントは、次の目的に引き続き使用できます。
特定のシーケンスで実行する必要のある操作。たとえば、インデックスの作成に続けて、そのインデックスを使用する外部キー制約を作成する場合など。
グループとして成功または失敗するようにしたい、すべてが同じ特定の
LOCK
句を使用している操作。オンラインで実行できない (つまり、引き続き table-copy メソッドを使用する) 操作。
特殊なシナリオでの正確な下位互換性のために必要な場合に強制的にテーブルコピー動作を行うために、
ALGORITHM=COPY
またはold_alter_table=1
を指定する操作。