Laravel 5 SQLSTATE[HY000]:一般错误:1215无法添加外键约束Laravel
我正在尝试使用artisan创建外键,但出现了此错误Laravel 5 SQLSTATE[HY000]:一般错误:1215无法添加外键约束Laravel,laravel-5,foreign-keys,migration,Laravel 5,Foreign Keys,Migration,我正在尝试使用artisan创建外键,但出现了此错误 [Illuminate\Database\QueryException] SQLSTATE[HY
[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。我认为这对我所做的每件事都足够大…