添加具有非唯一数据的唯一双列索引

时间:2013-06-14 22:15:07

标签: ruby-on-rails database indexing unique

我有一个rails应用程序并且需要添加一个唯一约束,因此a:record永远不会有相同的(:user,:hour)组合。

我想最好的方法是添加一个独特的索引:

add_index :records, [:user_id, :hour], :unique => true

问题是,我写的迁移失败了,因为我的数据库已经有了非唯一的组合。我如何找到这些组合?

This answer建议“查看GROUP BY和COUNT”,但我是一个新手,我希望能帮助解释一下。

我是否写了一个辅助方法来做到这一点?在我的应用程序中会去哪里? 在控制台中执行它太复杂了吧? 或者我应该看一下某种脚本?

谢谢!

1 个答案:

答案 0 :(得分:4)

  1. 在数据库控制台中运行此查询:SELECT *, COUNT(*) as n FROM table_name group by column_name HAVING n>1

  2. 修复重复的行

  3. 重新开始迁移

  4. 恕我直言,您应手动编辑重复数据,以确保数据已正确修复。

    <强>更新

    OP没有提到他/她正在使用Postgres,我给了MySQL一个解决方案。

    对于Postgres:

    基于此解决方案:Find duplicate rows with PostgreSQL

    运行此查询:

    SELECT * FROM (
      SELECT id,
      ROW_NUMBER() OVER(PARTITION BY merchant_Id, url ORDER BY id asc) AS Row
      FROM Photos
    ) dups
    WHERE 
    dups.Row > 1
    

    更多解释

    为了执行迁移并向列添加唯一约束,您需要先修复当前数据。通常,没有自动步骤,以确保您不会得到不正确的数据。

    这就是您需要手动查找重复行并进行修复的原因。给定的查询将显示哪些行是重复的。因此,从那里,修复数据,您应该能够运行迁移。

    Mooore更新:

    重复的行不会被标记。举个例子,如果你得到这样的结果:

    ID  ROW
    235 2
    236 3
    2   2
    3   3
    

    您应该选择id=235行,然后选择与id=235具有相同列值的每一行。从那里,您会看到每个id都与id=235重复。然后,只需逐个编辑它们。