通过数据库循环并删除具有重复信息的记录

时间:2018-08-10 23:55:50

标签: ruby-on-rails postgresql

我已经将数据导入到我的数据库中,并且有大量的记录(大约170万条记录),但是有一堆重复的信息,并且想知道最好的方法来删除和删除所有具有相同信息的记录。

该表包含两行带有我要检查的reference_id的行。它具有food_id和compound_id。我想循环并删除food_id和compound_id与另一条记录相同的所有重复项。我尝试这样做:

def self.delete_dup
        @contents = Content.select('DISTINCT ON (food_id, compound_id) *').pluck(:id)
        @duplicates = Content.where.not(id: @contents).delete_all

    end

但是它会引发错误,因为@contents中的参数太多,无法放在其中

1 个答案:

答案 0 :(得分:0)

它可能看起来像:

def self.delete_dup
  Content.select('DISTINCT ON (food_id, compound_id) *').pluck(:id).tap do |good_ids|
    (Content.pluck(:id) - good_ids).each_slice(1000) do |batch|
      Content.where(id: batch).delete_all
    end
  end
end

未测试!可能效率不高,但是如果只执行一次,则可能不在乎。自然,您可能需要摆弄each_slice的大小-您希望它尽可能大而不用制作AR barf。