无法解析 ActiveRecord::StatementInvalid: Mysql2::Error: Duplicate key name 'index_users_on_email'

Posted

技术标签:

【中文标题】无法解析 ActiveRecord::StatementInvalid: Mysql2::Error: Duplicate key name \'index_users_on_email\'【英文标题】:Unable to resolve ActiveRecord::StatementInvalid: Mysql2::Error: Duplicate key name 'index_users_on_email'无法解析 ActiveRecord::StatementInvalid: Mysql2::Error: Duplicate key name 'index_users_on_email' 【发布时间】:2021-12-09 00:49:12 【问题描述】:

这是我的迁移文件和方案。

class CreateUsers < ActiveRecord::Migration[6.1]
  def change
    create_table :users do |t|
      t.string :name
      t.string :email, index: true

      t.timestamps
    end
  end
end
  create_table "users", charset: "utf8mb4", collation: "utf8mb4_bin", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.index ["email"], name: "index_users_on_email"
  end

我想在电子邮件列上为用户添加唯一索引。

class AddUniqueIndexForUsersOnEnail < ActiveRecord::Migration[6.1]
  def change
    add_index(:users, :email, unique: true)
  end
end

但是,由于错误ActiveRecord::StatementInvalid: mysql2::Error: Duplicate key name 'index_users_on_email',我无法添加唯一索引。

我想在不回滚或删除数据库的情况下解决这个问题,但保留现有记录。

如果你知道如何解决这个问题,请告诉我。

【问题讨论】:

不能在已经包含非唯一记录的列中添加唯一索引 如果你的表有重复,添加索引有点晚了。最好的解决方案是检查表,删除重复项,然后运行迁移。 没有重复记录。但我无法在电子邮件列上添加唯一索引。 你已经有一个名为index_users_on_email的索引,先删除它然后重新添加它。 【参考方案1】:

你可以试试这个吗?

class AddUniqueIndexForUsersOnEnail < ActiveRecord::Migration[6.1]
  def change
    add_index :users, :email, name: 'some_name', unique: true
  end
end

【讨论】:

以上是关于无法解析 ActiveRecord::StatementInvalid: Mysql2::Error: Duplicate key name 'index_users_on_email'的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu 无法解析域名

无法解析的外部符号 C++

C++无法解析的外部命令和外部符号

无法解析的外部符号

ACE编程,无法解析外部符号

error LNK2001: 无法解析的外部符号