January 15, 2021 • ☕️ 5 min read
MySQL のバージョン : 5.7
Laravel のバージョン: 8.16.1
MySQL テーブルのカラムにコメントを追加しようとしたら、想像以上に業が深かった。
Laravel 使ってるので、まずは migrations で解決させよう。
コードはこんな感じ。
Schema::table('users', function (Blueprint $table) {
$table->string('first_name', 40)->comment('ファーストネーム');
});
見ての通り、型が要求される。
わざわざ migration ファイルを全部遡って取ってこないといけないの?
やだ面倒くさい。カラム名だけ指定させてよ。
調べてみたけど、特に回避策はないみたいだ。
という訳で、別の方法を考える。
renameColumn で、変更前と変更後の内容を同一にして、後ろにコメントを付けたら幸せになれるんじゃね?
と思って書いたコードがこちら。
Schema::table('users', function (Blueprint $table) {
$table->renameColumn('first_name', 'first_name')->comment('ファーストネーム');
});
結果、ダメでした。
マニュアルをよく読むと、renameColumn にそんなオプションは無いとの事だ。
サービスで付けてくれていいのに!
という訳で、別の方法を考える。
Laravel で、こんな感じで ALTER TABLE コマンドを書くことができる。
(以下はテーブル名にコメントを付けるコマンド)
DB::statement("ALTER TABLE `users` COMMENT 'ユーザ'");
MySQL以外を使う予定はないし、こんな感じで ALTER TABLE を直書きしてしまおう。
・・・と思って調べてみたが、カラムにコメントを追加するコマンドは無いみたい。
具体的には、Oracle でいう、↓みたいなコマンド。
COMMENT ON COLUMN TABLE1.COLUMN1 IS 'カラム1のコメント';
MySQL の場合、カラムへのコメント追加はオプション扱いになっていて、ALTER TABLE の MODIFY や CHANGE といったコマンドのオプション扱いとなっているため、何らかの命令とセットでなければいけない。
という事で、何かしらの小細工をしてみよう。
具体的には、COMMENTを変更するオプションが使えるコマンドを使ってみる。
ちなみにマニュアルはこちら。
https://dev.mysql.com/doc/refman/5.7/en/alter-table.html
スキーマの定義を変更するコマンドを使う。具体的には、こんな感じ。(ただし、以下のコマンドは失敗します)
ALTER TABLE users MODIFY first_name COMMENT 'ファーストネーム';
MODIFY は、引数に column_definition を要求していて、BIGINT とか VARCHAR(10) といった値を指定する必要がある。
め・・・面倒くせえ・・・。付けたいコメントが100以上あるんだ。それら1つ1つに対して、いちいち column_definition とか、やってられん。
という訳で、別の作戦。
列の名前を変更するコマンドを使う。
変更前:first_name → 変更後:first_name
みたいな感じで、変更前と変更後の値を同じものにしておけば、幸せになれるんじゃね?
・・・と思ったが、ここでも要求される column_definition ! 何で要るんだよ!
という訳で、上記と同じ理由で却下。
こんなのがあった。
| ORDER BY col_name [, col_name] ...
どうやら、格納されたテーブルをソートしてくれるらしい。
使い方はこんな感じ。
ALTER TABLE users ORDER BY first_name
おお!これは行けそうだ!
余計な引数を要求しない! そしてスキーマに一切変更が入らない!
この命令の末尾に
「 COMMENT ‘ファーストネーム’」
って付けたら、きっと幸せになれる!
・・・と思って意気揚々とコマンドを叩いたが、無情にもエラー。
エラーの原因は知らん。(マニュアル読めや、というメッセージ)
何でだ!? ちゃんとマニュアルの構文通りに書いてるぞ!
くそー。何でこんな苦労をせにゃならんのだー
ちなみに MySQL 8 はコマンドが豊富で、その辺りだと上手く行く可能性はある気がしている。
万策尽きて、愚直に Laravel の過去の Migration ファイルを拾っていくしかないのか・・・
と、がっくりしていたが、また別の方法を重いつた。
ALTER TABLE で、いちいち全カラムに対して column_definition を1つ1つ指定するなんて、とてもやってられないが、 簡単に定義を引っ張って来れたらいいんじゃね?
という訳で、こんな SQL を書いてみた。
select
table_name
,column_name
,column_type
,column_comment
from
information_schema.columns
where 1=1
and information_schema.columns.table_schema = database()
and information_schema.columns.table_name = 'users'
table_name | column_name | column_type | column_comment |
---|---|---|---|
users | id | bigint(20) unsigned | |
users | first_name | varchar(40) |
こんな感じで、column_type にデータ定義(多分)が格納されているので、後はこれがそのまま使えるか検証。
ALTER TABLE users CHANGE first_name first_name bigint(20) unsigned;
OKだ! 復元もバッチリ!
そして、デフォルト値や null 許容といった、他の定義が消えているという事も無い!
あとはこれを全カラム分用意して、migration ファイルに突っ込む!
ALTER TABLE コマンドは、Excel やスプレッドシートの数式で作成。
以上!
MySQL にカラムコメントをブッ込むまでの話でした!