LoginSignup
0
0
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

カラム毎の照合順序の違いによる MySQL テーブル変更エラーと、ロールバックできない不整合

Posted at

カラム毎の照合順序の違いによるテーブル変更エラー

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_idtemps.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',

その後、元々実行したかった外部キー制約の追加をして対応完了です。

おしまい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0