加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 添加已经不是唯一数据的唯一双列索引

发布时间:2020-12-17 02:34:45 所属栏目:百科 来源:网络整理
导读:我有一个rails应用程序,需要添加一个唯一约束,以便:记录永远不会有相同的(:user,:hour)组合. 我想最好的方法是添加一个唯一的索引: add_index :records,[:user_id,:hour],:unique = true 问题是,我写的迁移失败了,因为我的数据库已经有了非唯一的组合.我
我有一个rails应用程序,需要添加一个唯一约束,以便:记录永远不会有相同的(:user,:hour)组合.

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

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

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

This answer建议“检查GROUP BY和COUNT”,但我是一个新手,我希望得到一些帮助解释.

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

谢谢!

解决方法

>在数据库控制台中运行此查询: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的重复.然后,只需逐个编辑它们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读