从数据库中删除所有类似字段

时间:2013-03-09 21:30:29

标签: ruby-on-rails ruby sqlite

我有一个问题,因为我早些时候在工作中搞砸了。我的模型名为“xxx”,我有以下字段

:identity, :lat, :lon, :name, :tag, :some_id

我想删除所有具有相同

的行
:identity 

所以,例如,如果我有

{identity = "2348", name = "Mr. Jackson"}
{identity = "2348", name = "Mr. Jackson"}

我想只有

{identity = "2348", name = "Mr. Jackson"}

(我应该在传输大量数据之前放置验证器)。但是如何实现这一目标?

我正在考虑在Model中编写一些方法然后从我的控制台调用它。如何解决这个问题?

可能存在所描述方案的多个案例。

感谢您的时间和考虑。

2 个答案:

答案 0 :(得分:0)

您可以使用以下SQL查询解决此问题(适用于sqlite和postgresql):

DELETE FROM xxx WHERE id NOT IN (SELECT min(id) FROM xxx GROUP BY identity);

在执行此操作之前,请不要忘记复制数据库,因此如果出现任何问题,您可以再试一次。

对该查询究竟做了什么的一点解释:

SELECT min(id) FROM xxx GROUP BY identity

首先,它按身份对记录进行分组,即记录及其副本。然后,对于每个组,它会为您提供ID最低的记录,即您要保留的记录。

DELETE FROM xxx WHERE id NOT IN ()

删除id不包含在select提供的id集中的所有记录。然后删除所有重复项。

答案 1 :(得分:0)

创建另一个表格,其中包含所需的约束primary key (id),然后

insert into yyy (select * from xxx);

并忽略错误。这样您就可以保留原始数据的副本,以备您再次访问时使用。