質問: ### 質問内容 たくさん外部キー張られた大量データを含むテーブルに対して、 alter table A add XXXとすると、かなり時間がかかってしまいます。 特に本番環境などではロックがかかってしまうため、利用できません。 そのため、現状以下の手順でカラム追加をしています。 (対象テーブルを「A」とします。) 1カラム追加したA_newをcreate table 2AからA_newにselect&insert 3Aへの外部キー外す 4Aをdrop 5A_newをAにrename 6新しいAに外部キー設定 手間がかかるのでより良い手順があれば教えていただけないでしょうか。 ### 環境 MySQL5.7
回答: 多分こちら(【MYSQL】サイズの大きなテーブルに対して素早く属性変更を行う方法)などを参考にされたんだと思いますが、結局alter tableと同じことをやっています。 気になるのは、質問の手順で、元データに対してWRITEをロックしているかどうかです。 そうしないとデータに差異が発生します。 若しくは、元のテーブルをdropする前に、差分を新テーブルに追加するか。 alter table行うとしたら、普通は業務停止して行うものだと思いますので、alter tableを生かして時間を短縮する方法を考えた方が良いかと。 ALTER TABLEを上手に使いこなそう。 上記で、 > > スキーマの変更をしたい場合には注意するべき点が一つある。コマンドが一回で終わるように、カラムやインデックスの追加・削除を一行で書くということである。一行でALTER TABLEを書くには、加えるべき変更をカンマで区切って羅列する。 > > > とあります。 この点に注意されていないなら、もう一度試す価値はありそうです。