Laravel 5迁移 - 外键约束失败

时间:2015-10-21 09:54:43

标签: mysql database laravel laravel-5 foreign-keys

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

  
      
  • id(PK)
  •   
  • area_id(FK)
  •   
  • 居民(varchar)
  •   
  • heating_type_id(FK)
  •   
  • ...
  •   

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

这就是我所做的:

创建迁移以创建表格:

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()
{
    //
}

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

我做错了什么?

1 个答案:

答案 0 :(得分:4)

如果您的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;');