2013-01-31 130 views
5

可能重复:
How to delete duplicate rows with SQL?如何删除重复记录SQL

我有记录的表,我想删除所有重复记录

DELETE FROM 'table' 
WHERE 'field' IN 
(
SELECT 'field' FROM 'table' GROUP BY 'field' 
HAVING (COUNT('field')>1) 
) 

为什么这不正常吗?

+0

您是否收到错误消息或查询是否成功运行? –

+1

wouldnt您的查询删除所有字段,包括重复?如果你有两个重复的ID,你的IN()查询将删除这两个。你不想保留至少一条记录吗? – GGio

+2

mysql不允许你更新/删除你选择数据的表格。 –

回答

5

也许你可以用命令DISTINCT来探索,以便只选择基于字段的唯一记录。

您可以使用基于唯一条目创建新表。 作为示例...

CREATE TABLE nonDuplicates 
SELECT DISTINCT * FROM yourTable group by field 
+1

这只会起作用,因为MySQL对GROUP BY的处理基本上是不正确的,并且允许这种无效的语法。但它最可能是最快的解决方案。 –

+0

谢谢Peixe它工作得很好! – vdhmartijn

+1

@vdhmartijn:请阅读http://rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html以了解*为什么*它在MySQL中工作以及为什么其他DBMS会拒绝该语句无效。 –

1

这给你不止一个结果: -

SELECT field FROM `table` 
GROUP BY field 
HAVING (COUNT('field)>1 

尝试到chenge此:

SELECT TOP 1 field 
FROM `table` 
GROUP BY field 
HAVING (COUNT(field)>1 
+0

SELECT TOP 1不适用于我..仍然不能正常工作 – vdhmartijn

+0

这是如何删除任何东西的? –

0

首先获得所有副本,并将它们存储在阵列。

SELECT field 
FROM `table` 
GROUP BY field 
HAVING COUNT('field') > 1 

现在做你的PHP保存无论你想要一个结果,然后执行

DELETE 
FROM `table` 
WHERE field IN (your values) AND field != savedID 
+0

感谢您的反馈,但是我的目的是在没有PHP的情况下工作SQL – vdhmartijn

0

MySQL有插入一个子一个非常讨厌的限制,即不能使用正在更新/删除的表/ -选择。

但是,您可以通过加入要删除的表(而不是使用子选择)来解决此问题。

假设你有一种独特的标识符在表中(我假设在下面的语句列id):

DELETE d 
FROM table_with_duplicates d 
JOIN ( 
    SELECT min(id) as min_id, field 
    FROM table_with_duplicates 
    GROUP BY field 
) keep ON keep.field = d.field 
     AND keep.min_id <> d.id; 

这将让一行每个副本的(具有洛斯值在id列中)。

如果要删除全部重复行(不保留至少一个),只需删除AND keep.min_id <> d.id条件。

编辑

如果没有唯一列,但要删除所有重复(不保持至少一个排),那么你可以使用:

DELETE d 
FROM table_with_duplicates d 
JOIN ( 
    SELECT field 
    FROM table_with_duplicates 
    GROUP BY field 
    HAVING count(*) > 1 
) del ON del.field = d.field; 
+0

如果我没有ID,是否还有办法解决这个问题? – vdhmartijn

+0

@vdhmartijn:如果你想删除**所有**重复(至少保留一个),那么你可以不使用ID。否则,请参阅peixe的答案。 –

+0

感谢您帮助它现在工作! – vdhmartijn