Удалить уникальный индекс Laravel 5

Я продолжал получать это во время запуска php artisan migrate

SQLSTATE[42000]: синтаксическая ошибка или нарушение прав доступа: 1091 Не удается удалить «электронную почту»; проверьте, что столбец/ключ существует

Хотя я вижу, что электронная почта существует в моей базе данных.

введите описание изображения здесь


Мой скрипт миграции. Я пытался отказаться от уникального ограничения.

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AlterGuestsTable3 extends Migration {

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

        });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('guests', function(Blueprint $table)
        {

            $table->dropUnique('email');

        });
    }

}

Я забыл очистить какие-либо кеши?

Любые намеки для меня?


person cyb3rZ    schedule 20.03.2016    source источник
comment
Вы пытаетесь полностью удалить уникальный индекс или столбец электронной почты? Кроме того, просто на всякий случай ваша функция down также пытается удалить индекс вместо его воссоздания.   -  person stratedge    schedule 20.03.2016
comment
Я просто хочу удалить уникальный индекс.   -  person cyb3rZ    schedule 20.03.2016


Ответы (2)


При удалении индексов Laravel ожидает, что будет указано полное имя индекса.

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

Вот что говорится в документации о соглашении об именах (начиная с версии 5.2):

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

Я предполагаю, что именно поэтому вы получаете сообщение об ошибке. Индекса email нет, но, вероятно, есть индекс guests_email_unique.

Попробуйте эту миграцию:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AlterGuestsTable3 extends Migration {

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

        });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('guests', function(Blueprint $table)
        {
            //Put the index back when the migration is rolled back
            $table->unique('email');

        });
    }

}

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

Обратите внимание, что я также изменил метод down(), чтобы он возвращал удаление уникального индекса, добавляя его обратно.

person stratedge    schedule 20.03.2016
comment
Ты спас мою жизнь друг :) - person cyb3rZ; 20.03.2016
comment
Рад быть полезным! - person stratedge; 20.03.2016

person    schedule
comment
На мой взгляд, это лучший ответ, поскольку он позволяет Laravel определить имя ключа, используя процесс, который он выполняет для его создания. - person Fireynis; 04.03.2018
comment
По сравнению с принятым ответом, это ответ, который работает для меня (на L 5.8). - person andromeda; 05.09.2019
comment
Этот ответ лучше. - person Ranga Lakshitha; 18.05.2020
comment
Это лучшее решение. у меня работает и в версии 7.x. - person sdebarun; 21.07.2020
comment
Отлично работал в 8.x - person Han Tran; 09.06.2021