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

76

通过官方文档可以看到如下:

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

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



您可以简单地使用[]周围的字段名称来删除它:

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

UPD:根据9.x 的最新文档,它仍然是相关的。

于 2016-12-28T21:58:38.540 回答
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 回答