LARAVEL: MYSQL: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено - PullRequest
1 голос
/ 03 июля 2019

Я пытаюсь применить внешний ключ к столбцу user_id, связанному с идентификатором таблицы users

Я пытался сделать это путем миграции и в рабочей среде, и эта ошибка продолжает появляться:

Нарушение ограничения целостности: 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;

1-йкниги по миграции:

 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 ]

1 голос
/ 03 июля 2019

Похоже, вы обновляете пользователей таблицы вместо книг таблицы в UpdateBooksTable миграции.

Возможно, у вас уже есть данные в таблице книг.Из-за этого существующие книги не ссылаются на 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 голос
/ 03 июля 2019

Установите миграцию пользователя на ранее, до того, как произойдет миграция таблицы книг.В противном случае еще не существует пользовательской таблицы, на которую можно ссылаться при создании таблицы книг, и поэтому возникает ошибка.

Эта первая :

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

Затем, когдавы создаете таблицу книг, внешний ключ для пользователей будет иметь таблицу для подключения.

0 голосов
/ 03 июля 2019

Код файла миграции должен быть ниже:

        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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...