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

Dmi*_*lys 14 migration foreign-keys laravel-5

我试图创建一个外键使用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) 
Run Code Online (Sandbox Code Playgroud)

这是我的迁移:

<?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');
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

}
Run Code Online (Sandbox Code Playgroud)

知道如何解决这个错误?

kor*_*kiy 24

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

[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)类型.

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

  • 谢谢 !它奏效了.'$ table-> engine ='MyISAM'; '因为父表也是MyISAM 2. $ table-> integer('comment_lot_id') - > unique() - > unsigned(); 很多父表 (2认同)

fam*_*oes 13

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

如果您的父表如下所示:

$table->bigIncrements('id');
Run Code Online (Sandbox Code Playgroud)

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

$table->bigInteger('parent_id')->unsigned()->index();
$table->foreign('parent_id')->references('id')->on('parent');
Run Code Online (Sandbox Code Playgroud)

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


rap*_*2-h 5

引用这个答案:

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

SHOW ENGINE INNODB STATUS;

并查看该LATEST FOREIGN KEY ERROR部分。

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