当前位置: 首页 > 知识库问答 >
问题:

如果外键约束失败,Laravel无法更新或删除父行

袁良弼
2023-03-14

现在,当我运行命令php artisan migrate时出现问题,它成功地迁移了我的所有表,但当我运行rollback命令时,它会抛出错误,错误是出于我的目的

    public function up()
{
    Schema::create('purpose_of_visits', function (Blueprint $table) {
        $table->increments('id');
        $table->string('purpose', 100);
        $table->string('description', 197);
        $table->integer('speciality_id')->unsigned()->nullable();
        $table->timestamp('created_at')->useCurrent();
        $table->timestamp('updated_at')->useCurrent();
        $table->softDeletes();
        $table->integer('created_by')->unsigned()->nullable();
        $table->integer('updated_by')->unsigned()->nullable();

        $table->foreign('speciality_id')->references('id')->on('specialities')->onDelete('cascade');
        $table->foreign('created_by')->references('id')->on('users')->onDelete('cascade');
        $table->foreign('updated_by')->references('id')->on('users')->onDelete('cascade');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::dropIfExists('purpose_of_visits');
}

我的专业移民:

    public function up()
{
    Schema::create('specialities', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name', 50);
        $table->string('description',250)->nullable();
        $table->timestamp('created_at')->useCurrent();
        $table->timestamp('updated_at')->useCurrent();
        $table->softDeletes();
        $table->integer('created_by')->unsigned()->nullable();
        $table->integer('updated_by')->unsigned()->nullable();

        $table->foreign('created_by')->references('id')->on('users')->onDelete('cascade');
        $table->foreign('updated_by')->references('id')->on('users')->onDelete('cascade');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::dropIfExists('specialities');
}

即使我使用onDelete(“cascade”),我也不知道问题出在哪里。我们将非常感谢您的帮助!

共有3个答案

诸福
2023-03-14

抱歉,回复太晚。有两种情况下会抛出此错误

例如:我有表,如帖子,作者

下面是我的post表迁移

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('body');
            $table->unsignedInteger('author_id');
            $table->foreign('author_id')->references('id')->on('authors')->onDelete('cascade');
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

这是我的作者表迁移

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateAuthorsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('authors', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('authors');
    }
}

Situation 1:

现在,如果posts表迁移在authors表迁移之前运行,则抛出错误

情景2:

在某些情况下,如果错过无符号,可能会引发错误

Solution1:

使用

$table->unsignedInteger('speciality_id');
$table->unsignedInteger('speciality_id');
                $table->foreign('author_id')->references('id')->on('specialities')->onDelete('cascade');

而不是这个

$table->integer('speciality_id')->unsigned()->nullable();
$table->foreign('speciality_id')->references('id')->on('specialities')->onDelete('cascade');

如果再次失败,请使用此选项

try composer dumpautoload

adn then Schema::disableForeignKeyConstraints();

在迁徙的乞讨中

最后呢

Schema::enableForeignKeyConstraints();

你可能看起来像

public function up()
    {
    Schema::disableForeignKeyConstraints();
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
            $table->softDeletes();
        });

Schema::enableForeignKeyConstraints();
    }

如果出现同样的错误,请在下面附上错误截图和逗号

希望有帮助

拓拔耀
2023-03-14

删除前删除表的外键约束。

public function down()
{
    Schema::table('purpose_of_visits', function (Blueprint $table) {
        $table->dropForeign(['speciality_id']);
        $table->dropForeign(['created_by']);
        $table->dropForeign(['updated_by']);
    });
    Schema::dropIfExists('purpose_of_visits');
}
龚迪
2023-03-14

确保purpose_of_visits模型的可填充属性中有speciality_id、created_by和updated_by。在这里看到文档。

例如,在您的模型上。

protected $fillable = ['speciality_id','created_by','updated_by'];
 类似资料:
  • 问题内容: 进行时: 错误: 这是我的桌子: 问题答案: 照原样,必须先删除Advertisers表中的行,然后才能删除它引用的Jobs表中的行。这个: …实际上与应有的相反。实际上,这意味着您必须在作业表中有一条记录,然后才是广告商。因此,您需要使用: 纠正外键关系后,您的delete语句将起作用。

  • 我还在学习hibernate中的很多东西,以及如何处理hibernate中表与表之间的关系,所以在我的一个项目中,我面临着以下问题: 问题出在哪里? 我想做什么? 我正在尝试删除package实体,但不删除package表中引用的用户 我正在通过packageDAO对package实体调用delete

  • 我将按id删除对象,但出现如下错误: com。mysql。jdbc。例外情况。jdbc4。MySQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败(,constraint外键()引用) 我按id删除的方法是: 我的表的映射看起来像: Selection.java 作业Audit.java 审核组。JAVA AssignmentAudit

  • 我在这里使用了多对一双向关系,一旦我被放入数据库,我就不能删除文件,如果我试图删除,我会遇到异常,无法删除或更新父行:外键约束失败。 这是我的另一个实体类... 嗨这是我的完整栈迹

  • 问题内容: 我正在研究一个基本示例来测试操作,但出现异常。 我有以下实体: Employee.java EmpDetails.java 现在我在数据库中有员工ID为10的记录,在员工详细信息表中有相应的记录。 现在,当我在查询下面运行时: 我在想hibernate将删除员工记录和相应的员工详细信息记录,因为我已设置要删除的层叠类型。但我得到异常为: 引起原因:com.mysql.jdbc.exce

  • 我正在处理一个测试操作的基本示例,但我得到了异常。 我有以下实体: 有人能帮助我如何测试级联删除选项在这里吗?