Mysql删除重复项

时间:2012-03-15 17:12:18

标签: mysql database

我可以在表格中显示重复项

表名 reportingdetail 和列名 ReportingDetailID

SELECT DISTINCT ReportingDetailID from reportingdetail group by ReportingDetailID  HAVING count(ReportingDetailID) > 1;
+-------------------+
| ReportingDetailID |
+-------------------+
|         664602311 | 
+-------------------+
1 row in set (2.81 sec)

任何人都知道如何删除重复项并只保留一条记录?

我厌倦了以下

SELECT * FROM reportingdetail USING reportingdetail, reportingdetail AS vtable  WHERE      (reportingdetailID > vtable.id)  AND (reportingdetail.reportingdetailID=reportingdetailID);

但它只是 已删除 所有内容并保留了单个重复记录!

3 个答案:

答案 0 :(得分:3)

在MySQL中删除重复项的最快方式(我知道)是添加索引。

例如,假设reportingdetailID将成为该表的PK:

mysql> ALTER IGNORE TABLE reportingdetail 
    -> ADD PRIMARY KEY (reportingdetailID);

来自documentation

  

IGNORE是标准SQL的MySQL扩展。它控制ALTER的方式   如果新表中的唯一键上有重复项,则表可用   如果启用严格模式时发生警告。如果不是IGNORE   如果指定,则复制将被中止并在重复键错误时回滚   发生。如果指定了IGNORE,则只使用行的第一行   复制一个唯一的密钥。其他冲突的行将被删除。   不正确的值被截断为最接近的匹配可接受   值。

添加此索引将删除重复项并防止将来插入任何重复项。如果您不想要后一种行为,只需在创建索引后删除索引。

答案 1 :(得分:1)

以下MySQL命令将创建一个临时表,并使用一个列名称(具有重复项的列)将所有列GROUPED填充它,并按主键升序对它们进行排序。第二个命令从临时表创建一个真实的表。第三个命令删除正在使用的表,最后一个命令将第二个临时表重命名为当前正在使用的表名。

这是一个非常快速的解决方案。以下是四个命令:

CREATE TEMPORARY TABLE videos_temp AS SELECT * FROM videos GROUP by
    title ORDER BY videoid ASC;
CREATE TABLE videos_temp2 AS SELECT * FROM videos_temp;
DROP TABLE videos;
ALTER TABLE videos_temp2 RENAME videos;

答案 2 :(得分:0)

这应该会给你重复的条目。

SELECT `ReportingDetailID`, COUNT(`ReportingDetailID`) AS Nummber_of_Occurrences FROM reportingdetail GROUP BY `ReportingDetailID` HAVING ( COUNT(`ReportingDetailID`) > 1 )