Help us understand the problem. What is going on with this article?

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

More than 3 years have 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

Yorinton
NetFlix、Hulu、U-next、T-verを経てAmazonプライムに流れ着く。3度の飯より好きなものは特に無いけど、3度の飯時には必ずと言っていいほどアニメを嗜む。PHP、JS、TS、Vue.js、Laravel、少しだけGo. 開発責任者.
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away