4

我有一个 Rails 应用程序,需要添加一个唯一约束,以便 :record 永远不会有相同的 (:user, :hour) 组合。

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

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

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

这个答案建议“检查 GROUP BY 和 COUNT”,但我是一个完全的新手,我希望得到一些帮助来解释这一点。

我是否编写了一个辅助方法来做到这一点?我的应用程序中的哪个位置?在控制台中执行它太复杂了,对吧?还是我应该看某种脚本?

谢谢!

4

1 回答 1

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

  2. 修复重复的行

  3. 重新运行迁移

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

更新:

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

对于 Postgres:

基于此解决方案:使用 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

更多解释:

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

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

摩尔更新:

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

ID  ROW
235 2
236 3
2   2
3   3

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

于 2013-06-14T22:22:04.053 回答