Edited at

【メモ】Laravelで外部キー制約付きのテーブルをマイグレーションする時に気をつけた方がよかった点

More than 1 year has passed since last update.

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コマンドを使ってロールバックするようにする

(参考)

http://wiki.navicat.com/ja/index.php/%E5%A4%96%E9%83%A8%E3%82%AD%E3%83%BC%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%8C%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F

http://stackoverflow.com/questions/22615926/migration-cannot-add-foreign-key-constraint-in-laravel

http://jake-taro.hatenablog.com/entry/2016/03/30/170424