Laravelで外部キー制約付きのテーブルをマイグレーションで作成した時に何度もエラーになって大変だったのでメモ。
(laravelのバージョンは5.4.20)
最終的なマイグレーションファイルはこれ↓これでうまくいった。
//親テーブル・・users
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->string('id')->unique();
$table->string('name');
$table->string('email')->unique();
$table->integer('age');//誕生日から計算
});
}
//子テーブル・・events
public function up()
{
Schema::create('events', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('user_id');
$table->string('event_name');
$table->timestamps();
//外部キー制約
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade');
});
}
最初に出てきたエラー
[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL
: alter table `events` add constraint events_user_id_foreign foreign
key (`user_id`) references `users` (`id`))
僕が犯したミス(エラーの原因になったかどうかは不明)一覧
①innoDBの指定が無い
→以下を追加
$table->engine = 'InnoDB';
②親テーブルの参照されるキーにindexが無い
→以下を追加
$table->string('id')->unique();
③上記二つをやって他にも色々やって見たけど全然うまく行かない
→最初のエラーの時に、usersテーブルのマイグレーションファイルだけなぜかロールバック出来ておらず、かつ直接mysqlからusersテーブルを削除してしまっていた。
そのため、コマンドラインで、
php artisan migrate
をやっても、usersテーブルのマイグレーションファイルはmigrateされず、
usersテーブルが無い状態でeventsテーブルを作成していた。
そのため、親となるカラムが無いため外部キー制約も出来ない、という状態だった。
php artisan migrate:reset
で全てのマイグレーションをロールバック。
mysqlでテーブルが残ってないか確認。
再度、migrate。
php artisan migrate
成功!!
※注意点
・当たり前だけど外部キー制約がある場合は親テーブルが作られて無いとエラーになる
・mysqlから直接削除せずに、artisanコマンドを使ってロールバックするようにする