删除独特索引Laravel 5

kyo*_*kyo 23 php laravel laravel-5 laravel-migrations

跑步的时候我一直这样 php artisan migrate

SQLSTATE [42000]:语法错误或访问冲突:1091无法DROP'电子邮件'; 检查列/键是否存在

虽然我看到我的数据库中存在电子邮件.

在此输入图像描述


我的迁移脚本.我试图放弃唯一约束.

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

        });
    }

}
Run Code Online (Sandbox Code Playgroud)

我忘了清除任何缓存吗?

有什么提示吗?

str*_*dge 45

删除索引时,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');

        });
    }

}
Run Code Online (Sandbox Code Playgroud)

我理解在创建索引时指定列名称有点令人困惑,但是在稍后删除索引时,您需要提供索引的全名.

请注意,我也调整了down()方法,以便通过添加它来恢复丢弃唯一索引.


num*_*8er 41

通过官方文档您可以看到以下内容:

如果将列数组传递给删除索引的方法,则将根据表名,列和键类型生成常规索引名称:

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



您只需使用[]字段名称即可删除它:

Schema::table('guests', function(Blueprint $table)
{
    $table->dropUnique(['email']);
});
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这是更好的答案,因为它让Laravel使用它创建它的过程来确定关键名称. (6认同)