【问题标题】:Laravel migration - Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint failsLaravel 迁移 - 违反完整性约束:1452 无法添加或更新子行:外键约束失败
【发布时间】:2018-04-26 05:44:22
【问题描述】:

我正在尝试为使用此迁移创建的表 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');
});

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

[照亮\数据库\查询异常]

SQLSTATE[23000]:违反完整性约束:1452 无法添加或 更新子行:外键约束失败 (middleton
.#sql-5d6_162a, 约束inventories_local_id_foreign 外国 KEY (local_id) 参考contents (id) ON DELETE CASCADE ) (SQL:alter tableinventories添加约束 inventories_local_id_foreign 外键 (local_id) 引用 contents (id) 删除级联)

[PDO异常]

SQLSTATE[23000]:违反完整性约束:1452 无法添加或 更新子行:外键约束失败 (middleton
.#sql-5d6_162a,约束inventories_local_id_foreign 外国 KEY (local_id) 参考contents (id) ON DELETE CASCADE )

我做错了什么?

【问题讨论】:

    标签: mysql laravel laravel-migrations


    【解决方案1】:

    我遇到了同样的问题。通过将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

    UPD

    从 Laravel 7 开始,有更短的方法可以做同样的事情:

    $table->foreignId('some_id')->nullable()->constrained();
    

    nullableconstrained 之前也很重要。

    您可以在这里找到更多信息,official documentation

    【讨论】:

    • 这对于现有数据库来说很重要,感谢您激发我的记忆!
    【解决方案2】:

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

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

    【讨论】:

    • 是的,一旦我删除了所有表并立即运行所有迁移,它就可以工作了。谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 2020-08-13
    • 1970-01-01
    • 2016-10-27
    • 2015-05-25
    • 1970-01-01
    • 2014-03-12
    相关资源
    最近更新 更多