无法解析 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'的主要内容,如果未能解决你的问题,请参考以下文章