かきノート

MySQL テーブルのカラムにコメントを追加しようとしたら、想像以上に業が深かった。

January 15, 2021 • ☕️ 5 min read

MySQL のバージョン : 5.7
Laravel のバージョン: 8.16.1

MySQL テーブルのカラムにコメントを追加しようとしたら、想像以上に業が深かった。

Laravel : migrations

Laravel 使ってるので、まずは migrations で解決させよう。

コードはこんな感じ。

    Schema::table('users', function (Blueprint $table) {
        $table->string('first_name', 40)->comment('ファーストネーム');
    });

見ての通り、型が要求される。
わざわざ migration ファイルを全部遡って取ってこないといけないの?
やだ面倒くさい。カラム名だけ指定させてよ。

調べてみたけど、特に回避策はないみたいだ。
という訳で、別の方法を考える。

Laravel : renameColumn

renameColumn で、変更前と変更後の内容を同一にして、後ろにコメントを付けたら幸せになれるんじゃね?
と思って書いたコードがこちら。

    Schema::table('users', function (Blueprint $table) {
        $table->renameColumn('first_name', 'first_name')->comment('ファーストネーム');
    });

結果、ダメでした。
マニュアルをよく読むと、renameColumn にそんなオプションは無いとの事だ。

サービスで付けてくれていいのに!

という訳で、別の方法を考える。

MySQL

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

MySQL : ALTER TABLE - MODIFY

スキーマの定義を変更するコマンドを使う。具体的には、こんな感じ。(ただし、以下のコマンドは失敗します)

ALTER TABLE users MODIFY first_name COMMENT 'ファーストネーム';

MODIFY は、引数に column_definition を要求していて、BIGINT とか VARCHAR(10) といった値を指定する必要がある。
め・・・面倒くせえ・・・。付けたいコメントが100以上あるんだ。それら1つ1つに対して、いちいち column_definition とか、やってられん。

という訳で、別の作戦。

MySQL : ALTER TABLE - CHANGE

列の名前を変更するコマンドを使う。
変更前:first_name → 変更後:first_name
みたいな感じで、変更前と変更後の値を同じものにしておけば、幸せになれるんじゃね?

・・・と思ったが、ここでも要求される column_definition ! 何で要るんだよ!

という訳で、上記と同じ理由で却下。

MySQL : ALTER TABLE - ORDER BY

こんなのがあった。

| ORDER BY col_name [, col_name] ...

どうやら、格納されたテーブルをソートしてくれるらしい。
使い方はこんな感じ。

ALTER TABLE users ORDER BY first_name

おお!これは行けそうだ!
余計な引数を要求しない! そしてスキーマに一切変更が入らない!

この命令の末尾に
「 COMMENT ‘ファーストネーム’」
って付けたら、きっと幸せになれる!

・・・と思って意気揚々とコマンドを叩いたが、無情にもエラー。
エラーの原因は知らん。(マニュアル読めや、というメッセージ)

何でだ!? ちゃんとマニュアルの構文通りに書いてるぞ!

くそー。何でこんな苦労をせにゃならんのだー

ちなみに MySQL 8 はコマンドが豊富で、その辺りだと上手く行く可能性はある気がしている。

MySQL : ALTER TABLE - CHANGE(再び)

万策尽きて、愚直に 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 にカラムコメントをブッ込むまでの話でした!


Relative Posts:

【Docker】WordPress の テーブル定義書をドキュメント化してみる

May 3, 2021

物流エンジニアが本気出して考えた Laravel のアーキテクチャ:リポジトリパターン - 2

November 25, 2020

福岡の物流エンジニアが、七転び八起きしたあと九回転び、寝っ転がったまま何かやってる事を垂れ流しているブログ

RotateLinkImg-iconRotateLinkImg-iconRotateLinkImg-iconRotateLinkImg-icon