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

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

Я пытаюсь отменить мои миграции.

В моем файле миграции используются внешние ключи

$table->foreign('user_one')->references('id')->on('users');
$table->foreign('user_two')->references('id')->on('users');

Функция my down() похожа на

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

Когда я запускаю команду migrate

php artisan migrate:refresh --seed --env=local

Я получаю следующую ошибку

SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails (SQL: drop table `pm_convo`) 

Im не совсем уверен, что делать, чтобы исправить это.

Edit:

Я пробовал: $table->dropForeign('pm_convo_user_one_foreign');

Но я получаю ошибки с этим также

4b9b3361

Ответ 1

pm_convo_replys имеет внешний ключ, который ссылается на pm_convo, поэтому вы не можете удалить pm_convo сначала, не нарушая ограничение внешнего ключа в pm_convo_replys.

Для удаления обоих вам необходимо удалить pm_convo_replys сначала.

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

Ответ 2

Я думаю, что это лучший способ сделать это:

public function down()
{
    DB::statement('SET FOREIGN_KEY_CHECKS = 0');
    Schema::dropIfExists('tableName');
    DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}

Ответ 3

Я также столкнулся с такими проблемами. Перенос файла миграции здесь является основной проблемой. Лучший способ - создать файлы миграции один за другим. Сначала должны создаваться основные объекты. Миграция должна обновляться при каждом создании файла миграции. (с php artisan migrate:refresh)

Согласно @abkrim и @Eric

public function down()
{
    Schema::disableForeignKeyConstraints();
    Schema::drop('tableName');
    Schema::enableForeignKeyConstraints();
}

Ответ 4

Я думаю, что это самый правильный подход:

public function down()
{
    Schema::table('[table]', function (Blueprint $table) {
        $table->dropForeign('[table]_[column]_foreign');
        $table->dropColumn('[column]');
    });
}

Ответ 5

предпочитают делать это таким образом

    Schema::dropIfExists('tableNameChild');
    Schema::drop('tableNameParents');

Ответ 6

Важно, это для Laravel 5.4.

Согласно документам

Чтобы удалить внешний ключ, вы можете использовать метод dropForeign. Ограничения внешнего ключа используют одно и то же соглашение об именах как индексы. Таким образом, мы будем конкатенировать имя таблицы и столбцы в ограничении, а затем суффикс имени с помощью "_foreign"

$table->dropForeign('posts_user_id_foreign');

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

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

Я лично предпочитаю второй из-за простоты

Ответ 7

Вы можете сделать это очень легко, если вы добавили cascade на foeign key при создании таблицы. Если вы это сделаете, вы можете легко удалить таблицу без чего-то подобного для PostgreSQL.

DB::statement("drop table tableName if exists cascade");

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