SQLSTATE [HY000]:常规错误:1215无法添加外键约束Laravel

时间:2017-04-28 06:10:05

标签: laravel-5 foreign-keys migration

我正在尝试使用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');
    }
}

在批次表格中我使用lot_id作为id模型Lot.php我添加:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Lot extends Model {
    protected $primaryKey = 'lot_id';

}

知道如何解决此错误?

3 个答案:

答案 0 :(得分:22)

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

<强> [1]

  

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

$table->engine = “InnoDB”; 在您的迁移文件中,就在其他列定义之前。

我观察laravel始终默认为MyISAM,因此这条线是必须的。

<强> [2]

  

父级中引用的列必须是主要列或唯一列   键(一个或多个)。

父表中的这些声明很好:

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

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

<强> [3]

  

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

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

如果父表是char(20)类型,那么用于引用它的数据透视表列也必须是char(20)类型。

完成上述所有三项操作后,请根据需要定义您的外键关系。

答案 1 :(得分:3)

引用this answer:

  

要查找特定错误,请执行以下操作:

     

SHOW ENGINE INNODB STATUS;

     

查看LATEST FOREIGN KEY ERROR部分。

这可能是类型的问题。 comment_lot_id必须与lot_id完全相同。也许一个是签名而另一个是未签名的。

答案 2 :(得分:3)

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

如果您的父表如下所示:

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

然后,子迁移需要如下所示:

{{1}}

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