カラム毎の照合順序の違いによるテーブル変更エラー
MySQL では、データベース・テーブル・カラム単位のそれぞれで照合順序を指定できます。
照合順序の詳しい説明は省きますが、ざっくり言うと、文字を並び替えたり比較する時の優先順位を決めるルールのことです。
この「カラム単位」で指定できるという点で、過去問題が発生したことがありました。
あるsamples
テーブルにおけるtemp_id
カラムに外部キー制約を追加しようとしました。
ALTER TABLE `samples` ADD CONSTRAINT `samples_ibfk_1` FOREIGN KEY `temp_id` REFERENCES temps(id);
すると、下記のようなエラーが発生したのです。
Referencing column 'temp_id' and referenced column 'id' in foreign key constraint 'samples_ibfk_1' are incompatible.
これは、なんとsamples.temp_id
とtemps.id
のカラム照合順序が異なっていることにより発生したのです…。
ロールバックできない問題
そして、上記と付随して起こった問題があります。
元々複数テーブル・カラムにおいて外部キー制約を追加しようとしており、一連の処理を一つの
マイグレーションファイルにまとめていました。
しかし途中のテーブル変更処理が上記問題によりコケてしまったがために、テーブルが中途半端な状態で更新されるということが起こりました。
そして、このALTER TABLE
処理は、TRANSACTION
によるROLLBACK
が効かないのです。
そのため、途中でマイグレーション処理がコケた場合は、整合性を考慮しながら SQL を実行し、適切な状態になるよう修正しなければなりませんでした。
参考:https://www.zawatech.com/post?p=127
問題の解消
上記問題を解消するために、下記のようにカラム照合順序を修正し、カラム間の不一致を無くしました。
ALTER TABLE temps MODIFY COLUMN id VARCHAR(36) NOT NULL COLLATE 'utf8mb4_bin' COMMENT '仮の ID',
その後、元々実行したかった外部キー制約の追加をして対応完了です。
おしまい。