Попытка выполнить миграцию для удаления составного уникального ключа завершится неудачно без ошибок.
Я создал миграцию с 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
Ну, методом проб и ошибок я выяснил, чего мне не хватало.
Проблема в том, что 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']);
});
}
Я пытался понять, что происходит, потом пришло ко мне.
это твоя проблема
$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
Удачного кодирования 🙂
крупный чиновник