如何使用Laravel迁移从列中删除唯一约束?

时间:2018-04-13 07:44:23

标签: laravel database-migration laravel-5.5 laravel-5.6

我必须使用Laravel迁移从电子邮件列中删除唯一约束。这是我的代码:

class AlterEmailToUsers extends Migration
{
/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('email')->unique(false)->nullable()->change();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('users', function (Blueprint $table) {
       $table->string('email')->nullable(false)->unique()->change();
    });
}

}

但是当我运行php artisan migrate时,我收到以下错误:

SQLSTATE [42000]:语法错误或访问冲突:1061重复键名'users_email_unique'(SQL:alter table`users`添加唯一`users_email_unique`(`email`))

3 个答案:

答案 0 :(得分:3)

提供的解决方案工作正常,但这里只有一个小技巧:
您可以像这样传递一个带有列名的数组:

$table->dropUnique(['email']); 

在这种情况下,Laravel 将根据其约定自动生成索引名称

答案 1 :(得分:2)

 public function up()
 {
   Schema::table('users', function (Blueprint $table) {
    $table->string('email')->unique(false)->nullable()->change();
   });
  }

更改为

$table->dropUnique('users_email_unique');

答案 2 :(得分:0)

我认为您可以删除列

并使用以下命令重新创建:

  

请注意,它将删除您电子邮件列中的值

 if (Schema::hasColumn('users', 'email'))
    {
       Schema::table('users', function (Blueprint $table) {
             $table->dropColumn('email');
       });
    }

    Schema::table('users', function (Blueprint $table) {
       $table->string('email')->nullable();
    });