Laravel 5 SQLSTATE[HY000]:一般错误:1215无法添加外键约束Laravel

Laravel 5 SQLSTATE[HY000]:一般错误:1215无法添加外键约束Laravel,laravel-5,foreign-keys,migration,Laravel 5,Foreign Keys,Migration,我正在尝试使用artisan创建外键,但出现了此错误 [Illuminate\Database\QueryException] SQLSTATE[HY

我正在尝试使用artisan创建外键,但出现了此错误

[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) 
这是我的迁移:

<?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');
    }
}
你知道如何解决这个错误吗

引用


要查找特定错误,请运行以下命令:

显示引擎INNODB状态

并查看
最新外键错误
部分


这可能是一个类型问题<代码>注释批次id
必须与
批次id
的类型完全相同。可能一个已签名,另一个未签名。

将以下规则应用于迁移文件:

[1]

父数据透视表必须基于支持 外键引用(例如InnoDB for mysql)

执行
$table->engine=“InnoDB”
在迁移文件中,位于其他列定义之前

我观察到laravel总是默认为MyISAM,因此这一行是必须的

[2]

父级中引用的列必须是主列或唯一列 钥匙

父表中的这些声明很好:

$table->增量(“id”)表示列“id”是可引用的

$table->column_type(“column_name”)->unique()表示“column_name”列是可引用的

[3]

数据透视表列的类型必须与其数据透视表列的类型相同 引用的父表列

例如,应该引用增量(“id”)的数据透视表列必须是unsignedInteger类型

若父表是char(20)类型,那个么用于引用它的透视表列也必须是char(20)类型


完成以上三个步骤后,请根据需要定义外键关系。

看起来这不是您的问题,但我在Laravel 5.8中遇到了同样的错误,并发现了一个有趣的问题:Laravel现在将“id”列默认为“bigIncrements”,而不仅仅是“increments”。因此,您必须使用“biginger”来引用它,而不是像以前那样使用“integer”来引用它

如果父表如下所示:

$table->bigIncrements('id');
$table->bigInteger('parent_id')->unsigned()->index();
$table->foreign('parent_id')->references('id')->on('parent');
然后子迁移需要如下所示:

$table->bigIncrements('id');
$table->bigInteger('parent_id')->unsigned()->index();
$table->foreign('parent_id')->references('id')->on('parent');

希望这能帮助其他在5.8及更高版本中遇到此问题的人。

如下所述,确保两个int完全相同、无符号、长度等。这通常是失败的原因。要查找特定错误,请运行此
显示引擎INNODB状态。谢谢!它奏效了$表->引擎='MyISAM';'因为父表也是MyISAM 2$表->整数('comment\u lot\u id')->unique()->unsigned();对于父表来说,这帮助很大。我在laravel 5.8中遇到了同样的问题。在现有应用程序中创建每个新模型时,您可以在运行迁移之前将其从bigIncrements('id')切换到increments('id'),这将为您提供INT以匹配现有模型。考虑一下,一个无符号int仍然会给你一个最大值4294967295。我认为这对我所做的每件事都足够大…