В Laravel 5 миграция для удаления составного уникального ключа не работает

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

Я создал миграцию с php artisan make:migration и отредактировал код. Итак, у меня есть это

public function up()
{
Schema::table('ques_trilha_itens', function (Blueprint $table) {
$table->dropUnique('trilha_itens_trilha_id_questao_id_unique');
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('ques_trilha_itens', function (Blueprint $table) {
$table->unique(['trilha_id', 'questao_id']);
});
}

Строка 'trilha_itens_trilha_id_questao_id_unique' это тот, который отображается как составной уникальный ключ в MySQL. Так что я думаю, что строка должна быть использована, отбросьте два составных ключа.

Но когда работает php artisan migrate, ничего не происходит, никаких сообщений об ошибках, и миграция не выполняется.

Я попытался заменить строку в dropUnique дать имя таблицы в качестве первого термина ('ques_trilha_itens_trilha_id_questao_id_unique') и ничего.

Что-то мне не хватает?

ОБНОВИТЬ:

Команда MySQL SHOW CREATE TABLE ques_trilha_itens дать:

CREATE TABLE `ques_trilha_itens` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`trilha_id` int(10) unsigned NOT NULL,
`questao_id` int(10) unsigned NOT NULL,
`primeiro_item` tinyint(1) NOT NULL,
`item_principal_id` int(10) unsigned DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`chave` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `trilha_itens_trilha_id_questao_id_unique` (`trilha_id`,`questao_id`),
UNIQUE KEY `ques_trilha_itens_chave_unique` (`chave`),
KEY `trilha_itens_questao_id_foreign` (`questao_id`),
KEY `ques_trilha_itens_item_principal_id_foreign` (`item_principal_id`),
CONSTRAINT `ques_trilha_itens_item_principal_id_foreign` FOREIGN KEY (`item_principal_id`) REFERENCES `ques_trilha_itens` (`id`) ON DELETE SET NULL,
CONSTRAINT `trilha_itens_trilha_id_foreign` FOREIGN KEY (`trilha_id`) REFERENCES `ques_trilhas` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

0

Решение

Ну, методом проб и ошибок я выяснил, чего мне не хватало.

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

CONSTRAINT `ques_trilha_itens_item_principal_id_foreign` FOREIGN KEY (`item_principal_id`) REFERENCES `ques_trilha_itens` (`id`) ON DELETE SET NULL,
CONSTRAINT `trilha_itens_trilha_id_foreign` FOREIGN KEY (`trilha_id`) REFERENCES `ques_trilhas` (`id`)

Таким образом, мы должны отбросить индекс (KEY) раньше тоже.

KEY `trilha_itens_questao_id_foreign` (`questao_id`)

Только после этого я мог сбросить составленные ключи ['questao_id', 'trilha_id'],

В конце концов, моя миграция была такой

/**
* Run the migrations.
*
* @return void
*/

public function up()
{
Schema::table('ques_trilha_itens', function (Blueprint $table) {
// Remove chaves estrangeiras, índices e chaves não estrangeiras
$table->dropForeign('trilha_itens_questao_id_foreign');
$table->dropForeign('trilha_itens_trilha_id_foreign');
$table->dropIndex('trilha_itens_questao_id_foreign');
$table->dropUnique('trilha_itens_trilha_id_questao_id_unique');

// Refaz relações, agora sem a chave dupla
$table->foreign('questao_id')->references('id')->on('ques_questoes');
$table->foreign('trilha_id')->references('id')->on('ques_trilhas');
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('ques_trilha_itens', function (Blueprint $table) {
$table->unique(['questao_id', 'trilha_id']);
});
}
1

Другие решения

Я пытался понять, что происходит, потом пришло ко мне.

это твоя проблема

$table->dropUnique('trilha_itens_trilha_id_questao_id_unique'); <<< here be the problem

Ваша проблема в том, что вы пытаетесь сделать слишком много вещей одновременно.

бросить уникальный ключ. Вы должны использовать соответствующую номенклатуру.

table_name_column_name_unique
1) имя_таблицы _ 2) имя_ столбца _ 3) уникальный

так что вам придется запускать свой dropUnique () дважды.

$table->dropUnique('trilha_itens_trilha_id_unique'); //for trilha_id
$table->dropUnique('trilha_itens_questao_id_unique'); //for questao_id

Попробуйте, дайте мне знать, как это происходит.
Конечно, убедитесь, что вы запустите composer dump-autoload
Удачного кодирования 🙂

крупный чиновник

0