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

29

我需要使用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` add unique `users_email_unique`(`email`))

1
要删除索引,可以使用$table->dropUnique('email');语句。这将从"users"表中删除一个唯一索引。详细信息请参考此处 - iamab.in
https://laravel.com/docs/9.x/migrations#dropping-indexes - Jahongir Tursunboyev
3个回答

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

改为

$table->dropUnique('users_email_unique');

它不起作用了。问题不在down方法中,而是在up方法中的某个地方。我正在编辑我的问题,请也检查一下我的问题。 - aishazafar
我需要询问关于同一迁移的问题。我应该在这里问还是创建一个新的问题来问呢? - aishazafar
我想在同一步骤中使相同的字段可为空,但无法在一步中实现。 - aishazafar
请给我几分钟。 - aishazafar
它正在工作,非常感谢@Kuldeep Mishra的帮助。 - aishazafar

24

提供的解决方案已经完全可行,但这里只有一个小提示:
您可以像这样传递一个带有列名称的数组:

$table->dropUnique(['email']); 
在这种情况下,Laravel会根据其惯例自动生成索引名称。

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


4

当我在所有表上使用softDeletes时,遇到了这个问题,这导致新用户一旦逻辑删除就需要这样做。

所以,我创建了一个迁移文件,并设置了用户表(--table=users),并删除了约束条件,但是我为可能出现的新包含需求重新执行了操作。

但是我仅因为使用了softDeletes才使用了它,请注意您的业务规则。我还保留在请求规则中验证存在性。

代码如下(仅包括up和down方法):

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


public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->unique(['email']);
    });
}

虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题,将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - Jeremy Caney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接