今回はphpMyAdminで「1215 – Cannot add foreign key constraint」エラーが出て対処したメモです。
SQL文
下記のSQL文でテーブルを作成しようとしました。
CREATE TABLE demotable (
inventory_id INT PRIMARY KEY AUTO_INCREMENT,
item CHAR(7) NOT NULL,
FOREIGN KEY (item) REFERENCES item(Item),
);
この時に「1215 – Cannot add foreign key constraint」エラーが出ました。
エラーの原因
今回はitemテーブルとdemotableでリレーションをしようとしています。
itemテーブルが親テーブルでdemotableが子テーブルです。
原因が色々考えられますが下記を考えました。
- itemテーブルのItemカラムのデータ型がdemotableのitemカラムのデータ型と違う
- itemテーブルのItemカラムが主キーまたはUNIQUEになってない
- itemテーブルのItemカラムのCollationがutf8mb4_unicode_ciになってない
1つ目と2つ目は既に設定していましたが3つ目はまだ確認してなかったので確認しました。
Collationとは
DBの文字の比較ルールを決める設定です。
以下の動作に影響を与えます。
- 大文字・小文字の区別のあるなしによる文字列が等しいか
例えばhelloとHELLOで比較したときにCollationがutf8_general_ciだと同じとみなしてutf8_binだと異なるとみなします。
エラーが判明
itemテーブルのItemカラムのCollationがutf8mb4_unicode_ciになっていませんでした。
だから下記のSQL文でItemカラムのCollationを変更しました。
ALTER TABLE item MODIFY Item CHAR(7) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
そしてdemotableのitemカラムのCollationをutf8mb4_unicode_ciでdemotableを作成するSQL文に変えました。
CREATE TABLE demotable (
inventory_id INT PRIMARY KEY AUTO_INCREMENT,
item CHAR(7) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
FOREIGN KEY (item) REFERENCES item(Item),
);
これでdemotableが作成できました。