1

使用 rails,我设置了一个 HATBM 模型,其中包含一个 users 表、一个 groups 表和一个用于连接的 groups_users(所有这些都使用脚手架命令)。现在我想添加一个迁移以在 group_users 表的 group_id 和 user_id 列上添加唯一索引,以约束 group_id/user_id 对是唯一的。各个列 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 作为数据库。

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

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

4

2 回答 2

4

似乎UNIQUE约束无法用表中的当前数据填充。用GROUP BY和检查COUNT

于 2013-02-07T13:35:07.910 回答
1

您的“groups_users”表中包含重复数据,因此您必须手动清除重复数据或使用rake db:reset.

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

PS,请确保在运行上述命令之前备份您的数据库,因为它具有破坏性。

于 2013-02-07T14:50:07.243 回答