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

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint Laravel

我试图使用artisan创建外键,但此错误显示出来。

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');
    }
}

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

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).

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

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

[2]

The referenced columns in the parent must be a primary or unique
key(s).

父表中的这些声明很好:

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

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

[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.

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