36

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

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

データベースに電子メールが存在することがわかります。

ここに画像の説明を入力


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

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

        });
    }

}

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

ヒントはありますか?

4

2 に答える 2

59

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

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

ドキュメントがその命名規則について述べていることは次のとおりです(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()メソッドも調整したので、一意のインデックスを追加して元に戻すことに注意してください。

于 2016-03-20T02:00:21.273 に答える