Подтвердить что ты не робот

Удаление столбца с внешним ключом Ошибка Laravel: Общая ошибка: 1025 Ошибка при переименовании

Я создал таблицу с использованием миграции следующим образом:

public function up()
{
    Schema::create('despatch_discrepancies',  function($table) {
        $table->increments('id')->unsigned();
        $table->integer('pick_id')->unsigned();
        $table->foreign('pick_id')->references('id')->on('picks');
        $table->integer('pick_detail_id')->unsigned();
        $table->foreign('pick_detail_id')->references('id')->on('pick_details');
        $table->integer('original_qty')->unsigned();
        $table->integer('shipped_qty')->unsigned();
    });
}

public function down()
{
    Schema::drop('despatch_discrepancies');
}

Мне нужно изменить эту таблицу и удалить ссылку на внешний ключ и столбец pick_detail_id и добавить новый столбец varchar с именем sku после столбца pick_id.

Итак, я создал другую миграцию, которая выглядит так:

public function up()
{
    Schema::table('despatch_discrepancies', function($table)
    {
        $table->dropForeign('pick_detail_id');
        $table->dropColumn('pick_detail_id');
        $table->string('sku', 20)->after('pick_id');
    });
}

public function down()
{
    Schema::table('despatch_discrepancies', function($table)
    {
        $table->integer('pick_detail_id')->unsigned();
        $table->foreign('pick_detail_id')->references('id')->on('pick_details');
        $table->dropColumn('sku');
    });
}

Когда я запускаю эту миграцию, я получаю следующую ошибку:

[Осветите\Database\QueryException]
SQLSTATE [HY000]: общая ошибка: 1025 Ошибка при переименовании './dev_iwms_reboot/despatch_discrepancies' для './dev_iwms_reboot/#sql2-67c-17c464' (errno: 152) (SQL: изменить таблицу despatch_discrepancies удалить внешний ключ pick_detail_id)

[PDOException]
SQLSTATE [HY000]: общая ошибка: 1025 Ошибка при переименовании './dev_iwms_reboot/despatch_discrepancies' для './dev_iwms_reboot/#sql2-67c-17c464' (errno: 152)

Когда я пытаюсь изменить эту миграцию, запустив команду php artisan migrate:rollback, я получаю сообщение Rolled back, но на самом деле ничего не делает в базе данных.

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

4b9b3361

Ответ 1

Оказывается; когда вы создаете внешний ключ следующим образом:

$table->integer('pick_detail_id')->unsigned();
$table->foreign('pick_detail_id')->references('id')->on('pick_details');

Laravel однозначно называет ссылку на внешний ключ следующим образом:

<table_name>_<foreign_table_name>_<column_name>_foreign
despatch_discrepancies_pick_detail_id_foreign (in my case)

Поэтому, когда вы хотите удалить столбец с ссылкой на внешний ключ, вы должны сделать это следующим образом:

$table->dropForeign('despatch_discrepancies_pick_detail_id_foreign');
$table->dropColumn('pick_detail_id');

Обновление:

Laravel 4.2+ представляет новое соглашение об именах:

<table_name>_<column_name>_foreign

Ответ 2

Вы можете использовать это:

$table->dropForeign(['pick_detail_id']);
$table->dropColumn('pick_detail_id');

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

Ответ 3

Ключ (для меня) к решению этого заключался в том, чтобы удостовериться, что команде $table- > dropForeign() передано правильное имя отношения, не обязательно имя столбца. Вы не хотите передать имя столбца, так как это будет намного более интуитивно понятным IMHO.

Что для меня работало:

$table->dropForeign('local_table_foreign_id_foreign');
$table->column('foreign_id');

Итак, строка, которую я передал dropForeign(), которая работала для меня, была в формате:

[локальная таблица] _ [поле внешнего ключа] _foreign

Если у вас есть доступ к инструменту, например, Sequel Pro или Navicat, возможность визуализации данных будет очень полезна.

Ответ 4

Передайте массив с именем col

$table->dropForeign(['user_id']);

Ответ 5

Что-то, что мне пришло в голову, это то, что я не знал, куда положить блок Schema::table.

Позже я обнаружил, что ключ находится на ошибке SQL:

[Illuminate\Database\QueryException]
SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails (SQL: drop table if exists `lu_benefits_categories`)

Итак, блок Schema::table должен идти в функции down() миграции lu_benefits_categories и перед строкой Schema::dropIfExists:

public function down()
{
    Schema::table('table', function (Blueprint $table) {
        $table->dropForeign('table_category_id_foreign');
        $table->dropColumn('category_id');
    });
    Schema::dropIfExists('lu_benefits_categories');
}

После этого php artisan migrate:refresh или php artisan migrate:reset выполнит трюк.