web-dev-qa-db-fra.com

Drop Unique Index Laravel 5

Je n'arrêtais pas d'obtenir cela pendant l'exécution php artisan migrate

SQLSTATE [42000]: erreur de syntaxe ou violation d'accès: 1091 Can't DROP 'email'; vérifier que la colonne/clé existe

Tandis que je vois que l'email existe sur ma base de données.

enter image description here


Mon script de migration. J'essayais de supprimer la contrainte 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('email');

        });

    }

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

            $table->dropUnique('email');

        });
    }

}

Ai-je oublié de vider les caches?

Des conseils pour moi?

24
cyber8200

Lors de la suppression d'index, Laravel s'attend à ce que le nom complet de l'index soit donné.

Vous pouvez vérifier le nom complet de l'index dans votre base de données, mais si la clé a été générée par une précédente migration Laravel, son nom doit être conforme à une convention de dénomination simple et simple.

Voici ce que la documentation a à dire sur sa convention de nommage (à partir de la version 5.2):

Par défaut, Laravel attribue automatiquement un nom raisonnable aux index. Concaténez simplement le nom de la table, le nom de la colonne indexée et le type d'index.

Je suppose que c'est pourquoi vous obtenez une erreur. Il n'y a pas d'index email, mais il y a probablement un index guests_email_unique.

Essayez cette migration:

<?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');

        });
    }

}

Je comprends qu'il est un peu déroutant que lors de la création d'un index, vous spécifiez les noms de colonne, mais lorsque vous supprimez l'index plus tard, vous devez fournir le nom complet de l'index.

Veuillez noter que j'ai également ajusté la méthode down(), afin qu'elle annule la suppression de l'index unique en l'ajoutant à nouveau.

49
stratedge

Par documentation officielle Vous pouvez voir ce qui suit:

Si vous passez un tableau de colonnes dans une méthode qui supprime les index, le nom d'index conventionnel sera généré en fonction du nom de la table, des colonnes et du type de clé:

Schema::table('geo', function ($table) {
    $table->dropIndex(['state']); // Drops index 'geo_state_index' 
});



Vous pouvez le supprimer simplement en utilisant [] autour du nom du champ:

Schema::table('guests', function(Blueprint $table)
{
    $table->dropUnique(['email']);
});
47
num8er