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

39

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

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

$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');

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

  • 0
    У вас есть другая таблица с внешним ключом, который ссылается на pm_convo ?
  • 0
    Да, я делаю .. Вот таблица с именем pm_convo_replys, в которой есть $ table-> foreign ('c_id_fk') -> reference ('id') -> on ('pm_convo');
Показать ещё 2 комментария
Теги:
laravel-4

7 ответов

55
Лучший ответ

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');
}
62

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

public function down()
{
    DB::statement('SET FOREIGN_KEY_CHECKS = 0');
    Schema::dropIfExists('tableName');
    DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}
  • 5
    Это более простой способ сделать это наверняка, если у вас есть много внешних ключей, но будет ли это работать со всеми типами баз данных? Также не было бы возможно во время разработки, если ваши миграции не совсем правильно, чтобы случайно оставить проверки внешнего ключа? Лично я чувствую его чище, просто чтобы правильно их заказать
  • 0
    Спасибо, это решение решило мою проблему с усечением в моей базе данных.
Показать ещё 5 комментариев
13

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

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

public function down()
{
    Schema::disableForeignKeyConstraints();
    Schema::drop('tableName');
    Schema::enableForeignKeyConstraints();
}
  • 0
    Более DB::statement('SET FOREIGN_KEY_CHECKS = 0'); код, чем DB::statement('SET FOREIGN_KEY_CHECKS = 0');
7

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

public function down()
{
    Schema::table('[table]', function (Blueprint $table) {
        $table->dropForeign('[table]_[column]_foreign');
        $table->dropColumn('[column]');
    });
}
  • 0
    Я полностью согласен с вами: это правильный порядок шагов. Это должен быть принятый ответ.
3

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

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

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

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

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

0

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

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

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

$table->dropForeign('posts_user_id_foreign');

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню