Laravel migration - 完整性约束违规:1452无法添加或更新子行:外键约束失败

时间:2017-11-13 14:00:07

标签: mysql laravel-migrations

我正在尝试为使用此迁移创建的表inventories运行迁移:

    Schema::create('inventories', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('remote_id')->unsigned();
        $table->integer('local_id')->unsigned();
        $table->string('local_type');
        $table->string('url')->nullable()->unique();
        $table->timestamps();
    });

我正在尝试添加一个迁移运行,我在表中添加了一个外键:

    Schema::table('inventories', function (Blueprint $table) {
        $table->foreign('local_id')->references('id')->on('contents')->onDelete('cascade');
    });

但是,当我尝试运行迁移时出现错误:

  

[照亮\数据库\ QueryException]
  SQLSTATE [23000]:完整性约束违规:1452无法添加或   更新子行:外键约束失败(middleton
  。#sql-5d6_162a,CONSTRAINT inventories_local_id_foreign外国人   KEY(local_id)REFERENCES contentsid)ON DELETE CASCADE)   (SQL:alter table inventories添加约束   inventories_local_id_foreign外键(local_id)引用   关于删除级联的contentsid

                                                                                                                                      [PDOException]                                                        
     

SQLSTATE [23000]:完整性约束违规:1452无法添加或   更新子行:外键约束失败(middleton
  。#sql-5d6_162a,CONSTRAINT inventories_local_id_foreign外国人   KEY(local_id)REFERENCES contentsid)ON DELETE CASCADE)

我做错了什么?

2 个答案:

答案 0 :(得分:7)

inventories表中可能有local_id表中的某些记录在id表中没有对应的contents,因此出错。您可以通过以下两种方式之一解决它:

  • 关闭foreign_key_checks时运行迁移。这将禁用现有行的外键约束(如果这是您想要的)。它记录了here
  • 仅插入id表中具有相应contents字段的记录。您可以使用INSERT INTO.. WHERE EXISTS查询过滤掉记录,并仅插入这些记录。

答案 1 :(得分:7)

有同样的问题。通过在字段中添加nullable来解决此问题

Schema::create('table_name', function (Blueprint $table) {
    ...
    $table->integer('some_id')->unsigned()->nullable();
    $table->foreign('some_id')->references('id')->on('other_table');
    ...
});

请注意,迁移后所有存在的行将具有some_id = NULL