Laravel 5.4 - Ошибка удаления уникального ограничения для внешнего ключа

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

Вот исходный перенос:

Schema::table('table', function (Blueprint $table) {
    $table->bigInteger('other_table_id')->unsigned()->unique()->nullable();
    $table->foreign('other_table_id')->references('id')->on('other_table')->onDelete('set null');
});

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

Schema::table('table', function (Blueprint $table) {
    $table->dropUnique('table_other_table_id_unique');
});

Вот ошибка, которую я получаю.

SQLSTATE[HY000]: General error: 1553 Cannot drop index 'table_other_table_id_unique': needed in a foreign key constraint

Я также пытался использовать

Schema::table('table', function (Blueprint $table) {
    $table->dropUnique(['other_table_id']);
});

Но и это не сработало.

Я даже пытался отключить ограничение внешнего ключа при переносе:

Schema::disableForeignKeyConstraints(); // Disable constraint

Schema::table('table', function (Blueprint $table) {
    $table->dropUnique(['other_table_id']);
});

Schema::enableForeignKeyConstraints(); // Reenable constraint

Кажется, ничего не работает. Что я делаю не так?


person Oscar A Garcia    schedule 22.06.2018    source источник
comment
@JoelHinz спасибо за ссылку. Это дало мне достаточно информации, чтобы ответить на мой собственный вопрос. Я ответил своим решением ниже. Тем не менее, я отмечу вашу ссылку как ответ.   -  person Oscar A Garcia    schedule 22.06.2018


Ответы (1)


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

Проблема возникла из-за того, что внешний ключ использовал уникальный ключ в качестве ключа. Следовательно, внешний ключ необходимо удалить перед удалением уникального ключа, а затем снова настроить внешний ключ.

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('table', function (Blueprint $table) {
        $table->dropForeign(['other_table_id']);
        $table->dropUnique(['other_table_id']);

        $table->foreign('other_table_id')->references('id')->on('other_table')->onDelete('set null');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('table', function (Blueprint $table) {
        $table->unique('other_table_id');
    });
}
person Oscar A Garcia    schedule 22.06.2018