我有一个rails应用程序并且需要添加一个唯一约束,因此a:record永远不会有相同的(:user,:hour)组合。
我想最好的方法是添加一个独特的索引:
add_index :records, [:user_id, :hour], :unique => true
问题是,我写的迁移失败了,因为我的数据库已经有了非唯一的组合。我如何找到这些组合?
This answer建议“查看GROUP BY和COUNT”,但我是一个新手,我希望能帮助解释一下。
我是否写了一个辅助方法来做到这一点?在我的应用程序中会去哪里? 在控制台中执行它太复杂了吧? 或者我应该看一下某种脚本?
谢谢!
答案 0 :(得分:4)
在数据库控制台中运行此查询:SELECT *, COUNT(*) as n FROM table_name group by column_name HAVING n>1
修复重复的行
重新开始迁移
恕我直言,您应手动编辑重复数据,以确保数据已正确修复。
<强>更新强>
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
重复。然后,只需逐个编辑它们。