panda大学習帳外伝

勝利の方程式の解き方。

メインページ | panda大学習帳 | 第三倉庫(仮) | 用語集📒 | 本サイトについて | プライバシーポリシー


MariaDBで文字コードの設定が原因で”Foreign key constraint is incorrectly formed”と言われてしまった話。

最終更新日: Sat Dec 5 18:35:20 2020 +0900

はじめに

MariaDB 10.4.14でテーブルを後付けで追加しつつ、そのテーブルのあるカラムに対して外部キー制約を設定しようとしたら…

"Foreign key constraint is incorrectly formed"

と返されてしまい、解決に手間取ってしまって大変に遺憾であったので、現象、原因及び解決策をここに記します。

スポンサーリンク

現象

MariaDB 10.4.14でテーブルを後付けで追加しつつ、そのテーブルのあるカラムに対して外部キー制約を設定しようとしたら、

Can't create table <table_name> (error: 150 "Foreign key contraint is incorrectly formed")

というエラーが発生してテーブルが作成できない(※テーブル名はフィクションであり、実在のデータベースのテーブル名とは関係ありません)。なお、外部キー制約を削除してテーブルを作成することは可能であった。



原因

Google先生に原因を教えてもらおうとするも、検索結果のページで提示された原因のいずれにも該当せず(※この記事を最初に書いた時点(2020年12月)の情報です。)、途方に暮れかけました。

途方に暮れかけて昼休みを取ろうとしたまさにその時、追加先のデータベースもmysqldumpコマンドにより取得したdumpファイルから作成したものであったことを思い出しました。

ピコーン!!💡

「dumpファイル中のテーブルを作成するSQL文と比較すればなんかわかるんじゃね?」

という淡い期待の下、dumpファイル中のテーブルを作成するSQL文と上記の現象が発生したSQL文を見比べたところ、dumpファイル中のSQL文ではengine句の後に

CHARSET=utf8

と書かれているのを発見しました。

対応策

SQL文の修正

そこで、これを上記の現象が発生したテーブル作成用のSQL文の末尾が

ENGINE=InnoDB;

となっていたところを、

ENGINE=InnoDB CHARSET=utf8;

に変更すると…

なんと!!

動きました。ビンゴでした。🎯

所要時間

2時間くらい溶かしました。

スポンサーリンク

まとめ

今回は文字コードを指定して解決しましたが、MariaDBの文字コードの最新流行はutf8mb4であって、今時元のデータベースも込みでまだutf8で消耗しているのかといったような方面からのツッコミは平にご容赦ください。

この記事は以上です。

参考文献

リンク

メインページ | panda大学習帳 | 第三倉庫(仮) | 用語集📒 | 本サイトについて | プライバシーポリシー


スポンサーリンク