SQL

phpMyAdminの1215 – Cannot add foreign key constraintエラーの対処法

今回は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が作成できました。