SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint Laravel
我试图使用
1 2 3 | [Illuminate\Database\QueryException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `comments` add constraint `comments_comment_lot_id_foreign` foreign key (`comment_lot_id`) references `lots` (`lot_id` ) on delete cascade) |
这是我的迁移:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateCommentsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('comments', function (Blueprint $table) { $table->increments('id'); $table->text('comment'); $table->integer('comment_lot_id')->unsigned(); $table->timestamps(); }); Schema::table('comments', function ($table) { $table->foreign('comment_lot_id')->references('lot_id')->on('lots')->onDelete('cascade'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropForeign(['comment_lot_id']); Schema::dropIfExists('comments'); } } |
在批次表中我使用
1 2 3 4 5 6 7 8 9 10 | <?php namespace App; use Illuminate\Database\Eloquent\Model; class Lot extends Model { protected $primaryKey = 'lot_id'; } |
知道如何解决这个错误?
将以下规则应用于迁移文件:
[1]
The parent, pivot table(s) must be based on engines that supports
foreign key referencing (e.g InnoDB for mysql).
做
在您的迁移文件中,就在其他列定义之前。
我观察laravel始终默认为MyISAM,因此这条线是必须的。
[2]
The referenced columns in the parent must be a primary or unique
key(s).
父表中的这些声明很好:
[3]
The pivot table column must be of the same type as that of its
referenced parent table column.
因此,例如,应引用增量("id")的数据透视表列必须是unsignedInteger类型。
如果父表是char(20)类型,那么用于引用它的数据透视表列也必须是char(20)类型。
完成上述所有三项操作后,请根据需要定义外键关系。
看起来这对你来说不是问题,但我在Laravel 5.8中遇到了同样的错误并发现了一个有趣的问题:Laravel现在将'id'列默认为'bigIncrements'而不仅仅是'增量'。因此,不必像以前那样使用'整数'来引用它,而是必须使用'bigInteger'来引用它。
如果您的父表看起来像这样:
1 | $table->bigIncrements('id'); |
然后子迁移需要如下所示:
1 2 | $table->bigInteger('parent_id')->unsigned()->index(); $table->foreign('parent_id')->references('id')->on('parent'); |
希望这有助于其他人在5.8及更高版本中遇到此问题。
引用这个答案:
To find the specific error run this:
SHOW ENGINE INNODB STATUS; And look in the
LATEST FOREIGN KEY ERROR section.
这可能是类型的问题。