Laravel 5.7 Migration - Как сделать каскад удаления на внешнем ключе обнуляемым - PullRequest
0 голосов
/ 18 декабря 2018

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

 Schema::create('menu_links', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('parent_id')->nullable();
        $table->integer('order')->default(0);
        $table->timestamps();

        $table->foreign('parent_id')->references('id')->on('menu_links')->onDelete('cascade');
    }); 

При попытке выполнить миграцию я получаю следующую ошибку:

(errno: 150 "Foreign key constraint is incorrectly formed")

Как мне обойти это?Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Подождите, вы пытаетесь сделать внешний ключ для той же таблицы человеком?Шутки в сторону ?:)

Внешние ключи сделаны для соединения двух таблиц, вам не нужно делать столбец из menu_links, чтобы стать внешним ключом menu_links.

Внешний ключ в таблице НЕ ошибен, скажем, но яЯ не уверен, зачем вам такая конфигурация.В любом случае, если вам НУЖНО сделать это по какой-то причине, вы должны снять ограничение onDelete, потому что MySQL не поддерживает его внутри внешних ключей.Вот Документация для этого.

Если это была просто ошибка, и вы имели в виду другую таблицу, попробуйте следующее:

Обычно мы делаем внешний ключ как идентификаторнекоторые другие таблицы и, как правило, идентификаторы - это автоинкрементное целое число без знака.Итак, если это так, а id из таблицы menu_links в вашем случае представляет собой целое число без знака, то вы должны сделать parent_id такой же тип данных:

 Schema::create('RIGHT_TABLE_NAME', function (Blueprint $table) {
        $table->increments('id');
        $table->unsignedInteger('parent_id')->nullable();
        $table->integer('order')->default(0);
        $table->timestamps();

        $table->foreign('parent_id')->references('id')->on('menu_links')->onDelete('cascade');
    });

Основная идея заключается в проверкеТип данных parent_id и id ссылок меню должен быть точно таким же.

Нулевое значение как внешнего ключа не имеет ничего общего с ошибкой.

0 голосов
/ 18 декабря 2018
 Schema::create('menu_links', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('parent_id')->unsigned();
        $table->integer('order')->default(0);
        $table->foreign('parent_id')->references('id')->on('menu_links')->onDelete('cascade');
        $table->timestamps();
    }); 

Так как increments () создает столбец целых чисел без знака, вам также необходимо определить столбец внешнего ключа как целое число без знака:

Чтение: ограничения внешнего ключа

0 голосов
/ 18 декабря 2018

Вы должны попробовать это:

Обновленный ответ

Schema::create('menu_links', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('parent_id')->unsigned();
        $table->integer('order')->default(0);
        $table->timestamps();
    }); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...