多列上的rails唯一索引失败(sqlite3)

时间:2013-02-07 13:33:03

标签: ruby-on-rails

使用rails,我设置了一个HATBM模型,其中包含用户表,一个组表和一个用于连接的groups_users(全部使用scaffold命令)。 现在,我想添加一个迁移,为表groups_users的group_id和user_id列添加唯一索引,以限制group_id / user_id couple是唯一的。 各个列group_id和user_id不是null并且已经是索引。

以下是我想在迁移中执行的行:

add_index :groups_users, [:user_id, :group_id], :unique => true

我收到以下错误:

-- add_index(:groups_users, [:user_id, :group_id], {:unique=>true})
rake aborted!
An error has occurred, this and all later migrations canceled:

SQLite3::ConstraintException: constraint failed: CREATE UNIQUE INDEX "index_groups_users_on_user_id_and_group_id" ON "groups_users" ("user_id", "group_id")

我在mac os上使用rails 3.2.11,sqlite3作为db。

我确信必须有一些明显的解释,因为我没有在网上看到任何关于该错误的报告,但我非常困难......这里不满足什么约束?我试图删除group_id和user_id上的索引,但它不会改变任何东西。如果我创建没有唯一性的双列索引,那么它可以工作(但是没有帮助......)

有人的帮助非常感谢...

2 个答案:

答案 0 :(得分:4)

似乎表格中的当前数据无法满足UNIQUE约束。查看GROUP BYCOUNT

答案 1 :(得分:1)

您的“groups_users”表中包含重复数据,因此您必须手动清除欺骗行为或仅使用rake db:reset重置数据库。

一旦清除了重复项,通过从数据库中删除所有数据或找到欺骗,您应该能够无错误地运行rake db:migrate

PS,确保在运行上述命令之前备份了db,因为它具有破坏性。