Laravel 5 迁移 - 外键约束失败

Posted

技术标签:

【中文标题】Laravel 5 迁移 - 外键约束失败【英文标题】:Laravel 5 migration - foreign key constraint fails 【发布时间】:2016-01-20 06:20:34 【问题描述】:

我在运行迁移时遇到问题。我有一个带有一些表的 mysql 数据库。具体表为product_blender。表中有些字段是这样的:

id (PK) area_id (FK) 居民(varchar) heater_type_id (FK) ...

现在我想创建另一个名为installateur_types 的表。该表需要包含一个 PK 和一个 varchar 字段。我还想在 product_blender 表中创建一个 FK 到我新创建的表的 id

这就是我所做的:

已创建迁移以创建表:

public function up()

    Schema::create('installateur_types', function(Blueprint $table)
    
        $table->increments('id');
        $table->string('type');
    );


public function down()

    Schema::drop('installateur_types');

运行迁移,这是成功的。使用正确的字段创建表。

然后我创建了迁移以将 FK 字段添加到 product_blender 表中

public function up()

    Schema::table('product_blenders', function ($table) 
        $table->integer('installateurtype_id')->unsigned();
        $table->foreign('installateurtype_id')->references('id')->on('installateur_types')->onDelete('cascade');
    );


public function down()

    //

当我现在运行迁移时,我收到以下错误:

我做错了什么?

【问题讨论】:

product_blenders 表以前是否存在? 【参考方案1】:

如果您的products_blender 表不为空,那么当您添加一个不为空的新列(这是 eloquent 的默认值)时,它将自行假设一些默认值。此新列所引用的表中可能没有该值,从而导致外键约束失败。

解决此问题的一种方法是为新列提供默认值或将其设为可为空

$table->integer('installateurtype_id')->unsigned()->nullable();
$table->foreign('installateurtype_id')->references('id')->on('installateur_types')->onDelete('cascade');

还有另一种解决方案,可以关闭此检查,可以使用DB::statement('SET FOREIGN_KEY_CHECKS=0;') 完成。然后再次使用DB::statement('SET FOREIGN_KEY_CHECKS=1;') 将其转为未来。在您的代码中,您可以执行类似的操作

DB::statement('SET FOREIGN_KEY_CHECKS=0;');
$table->integer('installateurtype_id')->unsigned();
$table->foreign('installateurtype_id')->references('id')->on('installateur_types')->onDelete('cascade');
DB::statement('SET FOREIGN_KEY_CHECKS=1;');

【讨论】:

以上是关于Laravel 5 迁移 - 外键约束失败的主要内容,如果未能解决你的问题,请参考以下文章

:完整性约束违规:1452 无法添加或更新子行:laravel 迁移中的外键约束失败

外键 Laravel 8 foreignId + 约束 - 无法添加或更新子行:外键约束失败

Laravel 5.3 迁移:1215 无法添加外键约束

laravel 5.4 迁移错误:150“外键约束格式不正确”

Laravel 关于删除完整性约束违规:1451 无法删除或更新父行:外键约束失败

LARAVEL 5.5 外键约束的格式不正确'