SQLで「Cannot delete or update a parent row: a foreign key constraint fails」というエラーメッセージが出たので、その解決方法を紹介します。
リンク
原因
英文にもある通り、a foreign key constraintという外部キーの制約によって、テーブルの値を削除したり、更新できないということです。
外部キーとは
あるテーブル同士の列を結びたいときに利用します。
例として、成績表を作るとしましょう。userテーブルには受験者のidや基本情報があります。
resultsテーブルには、そのテストの5科目の結果があるとしましょう。userと紐づけるため、user_idカラムを外部キーに設定します。
CREATE TABLE users (
id int auto_increment,
name varchar(10),
PRIMARY KEY (id) -- 主キー
);
CREATE TABLE results (
id int auto_increment,
user_id int,
Japanese int,
English int,
Math int,
Science int,
Society int,
PRIMARY KEY (id), -- 主キー
FOREIGN KEY (user_id) REFERENCES users(id) -- 外部キー設定
);
外部キーを設定し、参照するテーブルを子テーブル、参照されるテーブルを親テーブルといいます。
こうすることで
親テーブルであるuserテーブルに存在しないidは、子テーブルであるresultsテーブルに登録させない。
子テーブルであるresultsテーブルに登録のある値を親テーブルであるuserテーブルから削除させない。
ということが可能になります。
「Cannot delete or update a child row: a foreign key constraint fails」 というエラーメッセージは、上の例でいくと、userテーブルのidを削除しようとしている、つまり子テーブルで登録のある値を親テーブルから削除しようとしているということです。
解決方法
子テーブルから削除、更新してから親テーブルで削除、更新をすると解決します。