MYSQLを使用してプログラムを作っていると、たまに「カラムの型変更」をしなければいけないことがります。
よくあるのが、textカラムだと文字数が足りずlongtextに変更するなどです。
開発初期であれば、データも入っていないのでMYSQLテーブルを削除して、新たに直したテーブルを追加すればよいのです。
が、実機にデータをそこそこ大量に登録していた場合、この方法はためらいます。
なぜならば、データを1から登録しなおさなければいけないからです。
データを消さずにカラムの型変更したい。
そんな方法がないか調べてみました。
ちなみに型変更する場所が1ヵ所程度であれば、phpmyadminを使用するほうが早いです。
ただ今回数十箇所、カラムの型変更があったためSQL文で何とかできないか調べました。
今回やりたいこと
上記のようなテーブルがある場合に、tinytextをtextに変更します。
これをSQL文で実行します。
カラムの型を変更するSQL文
調べてみると、カラムの型を変更するには「MODIFY」を使用すればできるとありました。
具体的には次のように記述します。
ALTER TABLE [テーブル名] MODIFY COLUMN memo text;
ALTERは、カラム追加などテーブルの構造を変更する場合に使用するSQLです。
MODIFY句は、ズバリ絡むの型を変更する命令です。
今回の目的にピッタリの句でした。
これを実行したところ、以下のように型が変更できました。
型変更の基本はこんなところですが、本題は「数十カ所の型を変更する」という点です。
本当にやりたいことは一度にたくさんの型を1文で変更すること
この手の解説記事はたいてい1カ所の型変更についてのみ書かれています。
でも1カ所だけならば、phpmyadminでやったほうが早いです。
カラムの型変更が数十カ所あるからSQL文で実行したいのです。
ということで、複数箇所の型変更を1回のSQL文で実行する方法を調べました。
このテーブルの複数のtinytextを1回のSQLでtextに型変更します
複数の型を一度に変更します。
調べてみたら、MODIFY句をただ並べるだけでした
複数の型変更を1回のSQLで実行するのって、どうやるんだろうと考えました。
INSERTの場合は、なかなか文法に悩まされました。
DELTEの場合は、WHEREを駆使する形でした。
型変更はどうすればいいのか?
調べたら「力技でOK」でした。
記述方法は次の通りです。
ALTER TABLE [テーブル名] MODIFY COLUMN memo01 text, MODIFY COLUMN memo02 text, MODIFY COLUMN memo03 text;
MODIFY句をカンマ(,)で区切ってつなげるだけです。
100箇所あれば、MODIFY句を100回記述します。
このSQLを実行したところ、以下のようにまとめて型変更できました。
MODIFY句は複数まとめて使用することで威力を発揮します
今回1データのカラムが400ほどあり、そのうち100カラムほど型変更が必要になりました。
しかも実機にデータを登録してしまっていたので、テーブル削除はできない状況でした。
最初はphpmyadminでやろうかとも思いましたが、あまりにも面倒なのでSQL文で実行することにしました。
どうやればいいのかを調べることから始めましたが、やり方がわかれば後は早かったです。
テスト環境で動作することを確認し、実機で実行しものの数秒で100カラムもの型変更が完了しました。
しかもデータはそのまま。
データ構造は後から変更しないに越したことはありませんが、もし変更しなければならない場合にもMYSQLにはそれなりに対応策があるということを学びました。
本記事がまたお役に立てば幸いです。