Mysql Laravel 5迁移-外键约束失败

Mysql Laravel 5迁移-外键约束失败,mysql,database,laravel,laravel-5,foreign-keys,Mysql,Database,Laravel,Laravel 5,Foreign Keys,我在运行迁移时遇到问题。我有一个mysql数据库和一些表。具体表格为product\u blender。表中的某些字段如下所示: id(主键) 区域标识(FK) 居民(瓦查尔) 加热类型id(FK) 现在我想创建另一个名为installateur\u types的表。该表需要包含一个PK和一个varchar字段。我还想在product\u blender表中创建一个FK到我新创建的选项卡的id 这就是我所做的: 创建迁移以创建表: public function up() { Sc

我在运行迁移时遇到问题。我有一个mysql数据库和一些表。具体表格为
product\u blender
。表中的某些字段如下所示:

  • id(主键)
  • 区域标识(FK)
  • 居民(瓦查尔)
  • 加热类型id(FK)
现在我想创建另一个名为
installateur\u types
的表。该表需要包含一个PK和一个varchar字段。我还想在
product\u 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\u 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()
{
    //
}
现在运行迁移时,出现以下错误:


我做错了什么?

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

解决此问题的一种方法是为新列指定一个默认值,或者只需将其设置为可为空

$table->integer('installateurtype_id')->unsigned()->nullable();
$table->foreign('installateurtype_id')->references('id')->on('installateur_types')->onDelete('cascade');
还有一种解决方案可以关闭此检查,可以使用
DB::statement('SET FOREIGN\u KEY\u checks=0;')
完成此检查。然后再次使用
DB::statement('SET-FOREIGN\u-KEY\u-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;');

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

解决此问题的一种方法是为新列指定一个默认值,或者只需将其设置为可为空

$table->integer('installateurtype_id')->unsigned()->nullable();
$table->foreign('installateurtype_id')->references('id')->on('installateur_types')->onDelete('cascade');
还有一种解决方案可以关闭此检查,可以使用
DB::statement('SET FOREIGN\u KEY\u checks=0;')
完成此检查。然后再次使用
DB::statement('SET-FOREIGN\u-KEY\u-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;');

product\u blenders
表以前存在吗?
product\u blenders
表以前存在吗?