Laravel 5 迁移 - 外键约束失败

nie*_*lsv 0 mysql database foreign-keys laravel laravel-5

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

  • 身份证(PK)
  • area_id (FK)
  • 居民(varchar)
  • heat_type_id (FK)
  • ...

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

这就是我所做的:

创建迁移以创建表:

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

public function down()
{
    Schema::drop('installateur_types');
}
Run Code Online (Sandbox Code Playgroud)

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

然后我创建了迁移以将 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()
{
    //
}
Run Code Online (Sandbox Code Playgroud)

当我现在运行迁移时,出现以下错误: 在此处输入图片说明

我究竟做错了什么?

Aks*_*tap 5

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

解决此问题的方法之一是为新列提供默认值或仅使其可为 null

$table->integer('installateurtype_id')->unsigned()->nullable();
$table->foreign('installateurtype_id')->references('id')->on('installateur_types')->onDelete('cascade');
Run Code Online (Sandbox Code Playgroud)

还有另一种解决方案,可以关闭此检查,可以使用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;');
Run Code Online (Sandbox Code Playgroud)