Error (1452): Cannot add or update a child row: a foreign key constraint fails 解決方法

SQLで「Cannot add or update a child 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 add or update a child row: a foreign key constraint fails」 というエラーメッセージは、上の例でいくと、userテーブルに存在しないidをresultsテーブルで追加、更新しようとしているということです。

解決方法

親テーブルに存在する値を子テーブルに設定するか、子テーブルが設定できるように親テーブルに事前に設定することで解決します。