はじめに
MariaDBでカラムのコメントの使いづらさに気が付いた・・という話です。
環境は、WSL2:UbuntuのMariaDB10.9です。
HeidiSQLでテーブル・カラムの日本語名称を確認したいよねという話がきっかけで、コメントで管理しようと考えてやってみたところ、カラムの日本語名称変更=コメントの変更で、ちょっとした問題に気づきました。
その顛末を順を追って書いてみようと思います。
Create Table時はなんら問題ない
カラムのコメントが問題になるのは、変更の時だけです。
例えば、Create時にはこんな感じでコメントとして定義できますが、別に問題はありません。
CREATE TABLE `test` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`col1` VARCHAR(50) NULL DEFAULT 'テスト' COMMENT 'カラム日本語名称' COLLATE 'utf8mb4_unicode_ci',
PRIMARY KEY (`id`) USING BTREE
)
COLLATE='utf8mb4_general_ci'
ENGINE=INNODB
COMMENT='テーブル日本語名称'
;
create tableでテーブルやカラムの日本語名称をコメントで設定するのは、ともに「COMMENT」を使って定義すればよいだけですからね。
以後、このテーブル・カラムを例に使います。
Alter Tableでテーブルコメント変更も問題ありません
テーブルの日本語名称の変更も同様です。
ALTER TABLE `test` COMMENT = '変更後日本語名称';
安全にテーブルコメントだけ変更できます。
カラムのコメント変更は要注意
さて、カラムのコメントです。
まず、何が問題なのかの実例をやってみます。
上記んも変更前の状態をまず確認します。
show full columns from test;
表示される内容は以下です。(余分なカラムは記載してません)
"Field" "Type" "Collation" "Null" "Key" "Default" "Extra" "Privileges" "Comment"
"col1" "varchar(50)" "utf8mb4_unicode_ci" "YES" "" "テスト" "" "select,insert,update,references" "カラム日本語名称"
ここでカラムのコメントを変更してみます。
どうもカラムの場合、テーブルのように「コメント」だけを変更する構文は用意されていないようなので、最低限の記述で以下のようになります。
ALTER TABLE test CHANGE COLUMN col1 col1 VARCHAR(50) NULL COMMENT '変更後カラム名称';
これで実行後に同じコマンドで情報を出力します。
"Field" "Type" "Collation" "Null" "Key" "Default" "Extra" "Privileges" "Comment"
"col1" "varchar(50)" "utf8mb4_general_ci" "YES" "" \N "" "select,insert,update,references" "変更後カラム名称"
わかりづらいとは思いますが、コメントの修正をしたことで「Default」の列に指定されていた「テスト」が消えて「\N」になっています。
なんと・・Alter文で指定していない箇所が意図せず消えてしまっています。
もちろん。
ALTER TABLE test CHANGE COLUMN col1 col1 VARCHAR(50) NULL DEFAULT 'テスト' COMMENT '変更後カラム名称';
のように、DEFAULTも指定して実行すれば大丈夫です。
でも、もれていたとしてもエラーにならず、サクッと消されてしまうので、意図せず「Default」に指定されていた値がクリアされているのに誰も気づかない・・なんててことが起こりえるわけです。
本番運用している環境だと、これはとても危険です。
万が一にも、カラムのコメント修正が原因でトラブルなどを発生させたら、お客からも会社からも糞みそに言われるのは間違いないですしね(笑)。
まとめ
上記が僕が気づいた「MariaDBでカラムのコメントの使いづらさ」です。
とりあえず、メリットよりもデメリット(リスク)が大きいので、カラムに初期セットした日本語名称は変更禁止で、新たな整備計画は白紙になりました。
これ・・あとで気づくと、じんわりダメージきついです。
ではでは。