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

问题描述 投票:11回答:3

我试图使用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';

}

知道如何解决这个错误?

laravel-5 foreign-keys migration
3个回答
23
投票

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

[1]

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

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

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

[2]

父级中引用的列必须是主键或唯一键。

父表中的这些声明很好:

qazxsw poi表示列“id”是可引用的

qazxsw poi表示列“column_name”是可引用的

[3]

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

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

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

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


6
投票

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

如果您的父表看起来像这样:

$table->increments(“id”);

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

$table->column_type(“column_name”)->unique();

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


3
投票

引用$table->bigIncrements('id');

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

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

并查看this answer:部分。

这可能是类型的问题。 SHOW ENGINE INNODB STATUS;必须与LATEST FOREIGN KEY ERROR完全相同。也许一个是签名而另一个是未签名的。

© www.soinside.com 2019 - 2024. All rights reserved.