web-dev-qa-db-ja.com

一意のインデックスを削除Laravel 5

実行中にこれを取得しましたphp artisan migrate

SQLSTATE [42000]:構文エラーまたはアクセス違反:1091 Ca n't DROP 'email';列/キーが存在することを確認してください

メールが私のデータベースに存在しているのを確認しました。

enter image description here


移行スクリプト。一意制約を削除しようとしました。

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

        });
    }

}

キャッシュをクリアするのを忘れましたか?

私に何かヒントはありますか?

24
cyber8200

インデックスを削除するとき、Laravelは、インデックスの完全な名前が指定されることを期待します。

データベースでインデックスのフルネームを確認できますが、キーが以前のLaravel移行によって生成されたものである場合、その名前は単一の単純な命名規則に準拠している必要があります。

documentation の命名規則については、次のとおりです(v5.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()メソッドも調整したので、再度追加することで一意のインデックスの削除を元に戻すことに注意してください。

49
stratedge

公式ドキュメント 次のように表示されます:

インデックスを削除するメソッドに列の配列を渡すと、テーブル名、列、およびキータイプに基づいて従来のインデックス名が生成されます。

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



フィールド名の周りに[]を使用するだけでドロップできます:

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