【问题标题】:rails unique index on multiple columns fails (sqlite3)多列上的rails唯一索引失败(sqlite3)
【发布时间】:2013-02-07 13:33:02
【问题描述】:

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

这是我要在迁移中执行的行:

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 上的索引,但它没有改变任何东西。如果我创建没有唯一性的双列索引,那么它可以工作(但无济于事......)

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

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    似乎UNIQUE 约束无法用表中的当前数据填充。请与GROUP BYCOUNT 联系。

    【讨论】:

    • 太棒了!实际上,我在表中有重复的 group_id、user_id 对,这阻止了唯一索引的创建。我绝对没有朝这个方向看...非常感谢!
    • @ckruse 我遇到了同样的问题,但我已经手动更改了重复值。由于我仍然收到错误,我认为该列上的索引尚未更新。我该如何解决?
    • @Sebastialonso 虽然索引可能没有更新,但我认为这种可能性不大。但是您可以通过删除并重新创建索引来轻松确保这一点。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多