删除MySQL表中的重复条目

时间:2012-03-26 21:22:03

标签: mysql sql

我有一个有几千行的表。该表包含两列nameemail。我有几个重复的行,例如:

  • John Smith | john@smith.com
  • John Smith | john@smith.com
  • Erica Smith | erica@smith.com
  • Erica Smith | erica@smith.com

删除所有重复结果的最简单方法是什么。例如,表格的内容为SELECT name, DISTINCT(email) FROM table

5 个答案:

答案 0 :(得分:7)

您可以通过在另一个表中选择该查询,然后重命名以替换原始表格来轻松完成此操作。

CREATE TABLE `table2` (
  `name` varchar(255), 
  `email` varchar(255), 
  UNIQUE KEY `email` (`email`));
INSERT INTO `table2` SELECT `name`, DISTINCT(`email`) FROM `table`;
RENAME TABLE `table` TO `table1`;
RENAME TABLE `table2` TO `table`;

请注意,此CREATE应根据您的实际表格格式进行调整。我在电子邮件字段中添加了唯一键,作为关于如何首先防止重复的建议。

或者,你可以循环这个

DELETE FROM `table` 
WHERE `email` IN (
  SELECT `email` FROM `table` GROUP BY `email` HAVING count(*) > 1
) LIMIT 1

每次调用会删除一条重复记录。限制的重要性在于不删除任何重复的行

答案 1 :(得分:2)

最简单的方法是将所有不同的值复制到新表中:

select distinct *
into NewTable
from MyTable

答案 2 :(得分:1)

DELETE FROM table
WHERE id 
NOT IN
(SELECT A.id
FROM 
(
SELECT name,MAX(id) AS id
FROM table
GROUP BY name
) A
)

答案 3 :(得分:1)

向表中添加自动增量字段。我相信当你添加它时,它将为你“回填”。由于MySql不允许基于同一个表的子查询进行删除,因此最简单的解决方案是将整个数据集转储到临时表中以供处理。假设您调用了新字段RowId和临时表tempTable,则可以使用如下代码:

DELETE FROM NameAndEmail
LEFT JOIN 
(     SELECT name, email, Max(RowId) as MaxRowId 
      FROM temptable 
      GROUP BY name, email
) as MaxId
WHERE NameAndEmail.Email = MaxId.Email
     and NameAndEmail.Name = MaxId.Name
     and NameAndEmail.RowId <> MaxId.RowId

答案 4 :(得分:1)

添加唯一索引

使用重复数据清理表的最简单方法是添加唯一索引:

set session old_alter_table=1;
ALTER IGNORE TABLE `table` ADD UNIQUE INDEX (name, email);

要特别注意第一个sql语句,不带它the IGNORE flag is ignored,并且alter table语句将失败并显示错误。