1
1

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 1 year has passed since last update.

【Laravel】外部キー制約削除でエラー。をいい加減やめたい。

Posted at

初心者による初心者のための備忘録です。

 

LaravelにてDBを操作する時に使うマイグレーションですが
 

外部キー制約でエラーが出て、なかなか進まん!という私のような方もいるかと思います。
 

ある程度慣れてきてから公式ドキュメントを見ると書いてあったりするんですけど・・・。それが初心者の我々にとっては読み解くのすら難しい:frowning2:

 
ってことでなるべく自分向けに、わかりやすく。

 

【開発環境】
Laravel5.8
 

【起きるエラー】

他のテーブルのカラムとひも付けたい。と思って外部キー制約をつけて

php artisan migrate

と叩いても
 

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table problems add constraint problems_drills_id_foreign foreign key (drills_id) references drills (id) on delete cascade on update cascade)

のように、外部キーを付けたマイグレーションファイルの部分でエラーが返ってきてしまう。

 

【よくやるミス(私はだいたいコレのどれか)】

 

●スペルミスはないか?

例えば外部キーを設定しようとしているカラム名と、外部キー制約のところのカラム名が違う。

$table->bigInteger('users_id')->unsigned();
〜
〜
//外部キー制約
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');

上のusers_idと下のforeign()の中のuser_idが不一致パターン。

 

●マイグレーションの順番がおかしくないか?

マイグレーションはどうやら日付順(作成日順)に読み込まれるようなので
「まだできていないテーブル」のカラムに向けた外部キーをつけようとしてもエラーになる。

例えば
$table->foreign('category_id')->reference('id')->on('category')
のように

商品テーブルのcategory_idと、カテゴリーテーブルのidをひも付けようとしても
(この場合)カテゴリーテーブルが先に出来てないと「え、ドコとひも付けるん?」となる。

ちなみに上記のエラーはこのパターンでした。

この場合はマイグレーションファイル名の日付部分を商品テーブル作成のマイグレーションファイルよりも前の日付にしてあげる

 

【よくわかってないけどコレでいける!】

作成時(migrate実行時)でエラー出るのは私の場合、上記のどちらかなんですが

問題はmigrate:rollbackを実行したとき:frowning2:

 
ここでしょっちゅうつまずく。軽い恐怖症。

 

私はイマイチ分かってはいないんですが(汗)外部キー制約付けたいカラムに対して下記のように書けばエラーなく通るようになりました:relaxed:

//onDelete('cascade')とonUpdate('cascade')があるといける

$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');

 

※公式ドキュメント
https://readouble.com/laravel/5.8/ja/migrations.html
 
 

コレでrollbackfreshも怖くないぜ!と思いたい・・・。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?