42
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-05-12

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

42
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?