ошибка laravel и artisan не может добавить внешний ключ при переносе

Я знаю, что на это отвечали много раз, так как я видел много предложений ответов, когда писал вопрос, но ни один из них фактически не дает мне правильный ответ.

Когда я пытаюсь добавить новое поле в таблицу и использовать переход ремесленника в laravel, я получаю сообщение об ошибке

General error: 1215 Cannot add foreign key constraint (SQL: alter table `pages` add constraint pages_page_status_foreign foreign key (`page_status`) references `page_status` (`status_value`))

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

class CreateStatusTable extends Migration {

/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('page_status', function($table) {
$table->increments('id');
$table->string('status_name');
$table->integer('status_value')->unsigned();
});
}

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

}

Это для таблицы состояния, и теперь я должен добавить новое поле в таблицу страниц, используя это.

class AddStatusToPagesTable extends Migration {

/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('pages', function($table) {
$table->integer('page_status')->unsigned();

$table->foreign('page_status')->references('status_value')->on('page_status');
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('pages', function($table) {
$table->dropForeign('pages_page_status_foreign');
});
}

}

И именно здесь появляется ошибка, по какой-то причине она не позволяет мне устанавливать внешний ключ в поле page_status в таблице страниц.

Я использую установку xampp на моем локальном хосте, и в phpmyadmin я вижу, что для таблицы установлено значение innodb, фактически все настроено на innodb по умолчанию. и внутри моей базы данных в таблице страниц, глядя на поле page_status, я сначала должен установить его индекс, чем я могу использовать отношения. почему не установлен индекс, я не знаю, но у меня уже есть идентификатор этой таблицы в качестве индекса и автор в качестве внешнего ключа.

До этого я также добавил несколько полей при создании таблицы страниц и использовании этого

class CreatePagesTable extends Migration {

/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('pages', function($table){
$table->increments('id');
$table->integer('author')->unsigned();
$table->foreign('author')->references('id')->on('users');
});
}

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

}

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

Так почему я не могу добавить новый внешний ключ сейчас?

1

Решение

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

$table->integer('page_status')->unsigned()->nullable();

Если вы не хотите делать его обнуляемым и собираетесь позже ввести допустимые значения внешнего ключа, вы можете временно отключить проверку внешнего ключа:

DB::statement('SET FOREIGN_KEY_CHECKS = 0');

Schema::table('pages', function($table) {
$table->integer('page_status')->unsigned();
$table->foreign('page_status')->references('status_value')->on('page_status');
});

DB::statement('SET FOREIGN_KEY_CHECKS = 1');
1

Другие решения

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

Я до сих пор не понимаю, почему в моей первой миграции, когда я добавил поле «автора», оно сделало его автоматически в качестве индекса, но для этого я заработал, установив индекс дополнительно так:

    Schema::table('pages', function($table) {
$table->integer('status')->unsigned()->nullable();
$table->index('status');

$table->foreign('status')->references('status_value')->on('page_status');
});
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector