我正在尝试删除所有重复项,但仅保留单个记录(较短的 ID)。以下查询会删除重复项,但需要进行大量迭代才能删除所有副本并保留原始副本。
DELETE FROM emailTable WHERE id IN (
SELECT * FROM (
SELECT id FROM emailTable GROUP BY email HAVING ( COUNT(email) > 1 )
) AS q
)
它的MySQL。
DDL
CREATE TABLE `emailTable` (
`id` mediumint(9) NOT NULL auto_increment,
`email` varchar(200) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=298872 DEFAULT CHARSET=latin1
尝试这个:
以上内容适用于我对 50 封电子邮件的测试(5 封不同的电子邮件重复了 10 次)。
您可能需要在“电子邮件”列上添加索引:
250,000 行可能有点慢。在一个有 150 万行(正确索引)的表上,这对我来说很慢,这就是我想出这个策略的方式:
内存表的好处是使用了一个索引(minID 上的主键),它比普通临时表加快了进程。
这是一个更简化的删除过程:
以下是一些示例数据:
我跑了他们。结果如下:
如图所示,emailTable 将包含每个电子邮件地址的第一次出现和相应的原始 id。对于这个例子:
CAVEAT:我通过临时表方法回答了一个类似的关于表删除的问题。
试试看 !!!
这是一个真正快速的 Itzik 解决方案。这将适用于 SQL 2005 及更高版本。