Ограничение внешнего ключа сформировано неправильно. Как правильно исправить? - PullRequest
0 голосов
/ 10 января 2020

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

Schema::create('questions', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('title');
    $table->string('slug')->unique();
    $table->text('body');
    $table->unsignedInteger('views')->default(0);
    $table->unsignedInteger('answers')->default(0);
    $table->integer('votes')->default(0);
    $table->unsignedBigInteger('best_answer_id')->nullable();
    $table->unsignedBigInteger('user_id');
    $table->timestamps();

    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    $table->foreign('best_answer_id')->references('id')->on('answers')->onDelete('SET NULL');
});

Schema::create('answers', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedInteger('question_id');
    $table->unsignedInteger('user_id');
    $table->text('body');
    $table->integer('vote_count')->default(0);
    $table->timestamps();
});

Я не знаю, почему это не работает. Я совершенно уверен в этом. Я что-то здесь упускаю?

Я получаю сообщение об ошибке best_answer_id часть внешнего ключа. Часть user_id не имеет проблем.

General error: 1005 Can't create table `laravel_qa`.`questions` (errno: 150 "Foreign key constraint is incorrectly formed")")

Ответы [ 4 ]

1 голос
/ 10 января 2020

Я только что попробовал использовать те же миграции, что и у вас. Я получаю сообщение об ошибке, когда я запускаю обе миграции на 1 go, некоторые моменты, которые необходимо учитывать при создании миграций, указанных выше:

  • Убедитесь, что обе миграции созданы индивидуально
  • Убедитесь, что миграция для ответов создана и выполняется перед вопросами
0 голосов
/ 10 января 2020

Обе таблицы являются взаимозависимыми. Поэтому создайте новую схему для наилучшего сопоставления ответов.

Schema::create('best_answers', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedInteger('question_id');
    $table->unsignedInteger('answer_id');
    $table->timestamps();
    $table->foreign('question_id')->references('id')->on('questions')
    ->onDelete('SET NULL');
    $table->foreign('answer_id')->references('id')->on('answers')
    ->onDelete('SET NULL');

});

Удалить код отметки времени $table->timestamps();. Если метки времени не нужны.

0 голосов
/ 10 января 2020

Решение здесь:

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

Миграции должны быть созданный Top-Down.

Поскольку best_answer_id принадлежит к таблице answers, но таблица answer еще не перенесена.

Попробуйте выполнить это, ваша таблица будет перенесена без каких-либо ошибка.

Schema::create('answers', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedInteger('question_id');
    $table->unsignedInteger('user_id');
    $table->text('body');
    $table->integer('vote_count')->default(0);
    $table->timestamps();
});

Schema::create('questions', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('title');
    $table->string('slug')->unique();
    $table->text('body');
    $table->unsignedInteger('views')->default(0);
    $table->unsignedInteger('answers')->default(0);
    $table->integer('votes')->default(0);
    $table->unsignedBigInteger('best_answer_id')->nullable();
    $table->unsignedBigInteger('user_id');
    $table->timestamps();

    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    $table->foreign('best_answer_id')->references('id')->on('answers')->onDelete('SET NULL');
});

Вы также можете отменить предыдущую миграцию, а затем просто запустить ее выше.

0 голосов
/ 10 января 2020

Вы получаете эту ошибку, вероятно, потому что пытаетесь создать questions таблицу до answers таблицы.

questions таблица зависит от answers таблица.

Итак, сначала создайте answers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...