ограничение внешнего ключа: невозможно удалить таблицу, потому что другие объекты зависят от нее - PullRequest
0 голосов
/ 15 мая 2018

Я выполняю миграции на Laravel 5.1 и переключаю базы данных с Mysql на Postgres.

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

- DB::statement('SET FOREIGN_KEY_CHECKS = 0');
- Do stuff
- DB::statement('SET FOREIGN_KEY_CHECKS = 1');

Postgres не предлагает этого.

При запуске миграцийОшибка1014 *

СОВЕТ: используйте DROP ... CASCADE, чтобы отбрасывать и зависимые объекты.(SQL: отбрасываемая таблица "table2")

Вопрос : Эта жалоба мне любопытна, поскольку я задаю ->onDelete('cascade'); для создания внешнего ключа.Почему это происходит?

Фрагменты:

Создать таблицу Table1:

...
public function down()
{
    Schema::drop('table1_table2');
    Schema::drop('table1'); 
}

Создать таблицу Table2 (Вызывается после переноса таблицы 1):

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

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

public function up()
{
  Schema::table('table1_table2', function(Blueprint $table)
  {
    $table->foreign('table1_id')->references('id')->on('table1')->onDelete('cascade');
    $table->foreign('table2_id')->references('id')->on('table2')->onDelete('cascade');
  });
  ...
 }

public function down()
{
    ...
    Schema::table('table1_table2', function(Blueprint $table)
    {
        $table->dropForeign('table1_id');
        $table->dropForeign('table2_id');
    });
    ...
}

1 Ответ

0 голосов
/ 15 мая 2018

Эта жалоба мне любопытна, когда я установил -> onDelete ('cascade');на создание внешнего ключа.Почему это происходит?

Ключевой термин здесь «при удалении» - когда вы удаляете строку из одной таблицы, этот параметр будет определять, ссылаются ли на строки со ссылками на внешние ключи эта строка также будет удалена.

Однако ваш скрипт изменений не удаляет строки, он удаляет таблицу .Поэтому это другое событие, на которое не влияет опция ON DELETE для внешнего ключа.

CASCADE, упомянутое в подсказке, является ключевым словом в операторе DROP TABLE, , описанном вруководство в разделе «Отслеживание зависимостей» :

Кавычки:

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

и:

, если вы не хотите удалять все зависимые объекты по отдельности, вы можете запустить DROP TABLE products CASCADE;, и все зависимые объекты будут удалены, как и любые объекты, которые зависят от них, рекурсивно.В этом случае он не удаляет таблицу заказов, он только удаляет ограничение внешнего ключа.

и:

Почти все команды DROP в PostgreSQL поддерживают указание CASCADE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...