LARAVEL:MYSQL:违反完整性约束:1452无法添加或更新子行:外键约束失败

时间:2019-07-03 15:14:54

标签: php mysql laravel

我正在尝试将外键应用于与表用户

的ID相关的user_id列

我尝试通过迁移和在工作台中执行此操作,并且此错误不断出现:

  

违反完整性约束:1452无法添加或更新子级   行:外键约束失败

这是mysql:

ALTER TABLE `dh_booky`.`books` 

ADD CONSTRAINT `books_user_id_foreign`

  FOREIGN KEY (`user_id`)

  REFERENCES `dh_booky`.`users` (`id`)

  ON DELETE NO ACTION

  ON UPDATE NO ACTION;

第一本迁移书籍:

 public function up()
    {
        Schema::create('books', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('title_id')->unsigned();
            $table->foreign('title_id')->references('id')->on('titles');
            $table->bigInteger('author_id')->unsigned();
            $table->foreign('author_id')->references('id')->on('authors');
            $table->string('image')->nullable();

        });
    }

更新迁移书籍:

class UpdateBooksTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
        $table->bigInteger('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
        //php artisan make:migration update_votes_table



});

用户迁移:

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
        });
    }

3 个答案:

答案 0 :(得分:1)

似乎您在更新 UpdateBooksTable 迁移中的 users 表而不是 books 表。

您可能已经在books表上有了数据。因此,现有书籍没有引用user_id,这会导致错误。

您可以将 nullable()添加到user_id,以便现有书籍的user_id为null。

class UpdateBooksTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        //Seem you are updating books table. change users to books 
        Schema::table('users', function (Blueprint $table) {
            $table->bigInteger('user_id')->unsigned()->nullable();
            $table->foreign('user_id')->references('id')->on('users');
        });
    }
}

答案 1 :(得分:1)

将用户迁移设置为在books表迁移发生之前的更早版本。否则,在创建books表时,尚无要引用的用户表,因此会出错。

第一

Schema::create('users', function (Blueprint $table) {...}

然后,在创建books表时,用户的外键将有一个表可连接。

答案 2 :(得分:0)

迁移文件代码应位于以下位置:

        Schema::table('books', function (Blueprint $table) {
            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')
                  ->on('users')
                  ->references('id');
        });

可以这样产生SQL:

ALTER TABLE books

ADD CONSTRAINT books_user_id_foreign

FOREIGN KEY fk_user_id(user_id)

REFERENCES users (id)

ON DELETE NO ACTION

ON UPDATE NO ACTION;