我想知道是否有办法通过一个查询来做到这一点。
似乎当我最初使用虚拟数据填充我的数据库以处理10k记录时,在其中的某个地方,所有脚本都将多达1,044行,其中行是重复的。我决定使用
SELECT x.ID, x.firstname FROM info x
INNER JOIN (SELECT ID FROM info
GROUP BY ID HAVING count(id) > 1) d ON x.ID = d.ID
我想弄清楚的是通过这个单一的查询我可以添加另一个部分来删除每个发现的一个匹配的欺骗吗?
我也意识到ID列应该设置为自动增量,但它不是
答案 0 :(得分:4)
我最喜欢删除重复项的方法是:
ALTER IGNORE TABLE info ADD UNIQUE (ID);
进一步解释(供参考,看看here)
UNIQUE - 您要为ID列添加唯一索引。
IGNORE - 是标准SQL的MySQL扩展。如果新表中的唯一键上存在重复项,或者启用了严格模式时出现警告,它将控制ALTER TABLE的工作方式。如果未指定IGNORE,则复制将中止并在发生重复键错误时回滚。如果指定了IGNORE,则只使用第一行在唯一键上具有重复项的行。其他冲突的行将被删除。不正确的值将被截断为最接近的匹配可接受值。
答案 1 :(得分:0)
最有效的方法是按以下步骤执行:
第1步:将非重复项(唯一元组)移动到临时表中
CREATE TABLE new_table as
SELECT * FROM old_table WHERE 1 GROUP BY [column to remove duplicates by];
第2步:删除删除旧表。我们不再需要包含所有重复条目的表,所以请删除它!
DROP TABLE old_table;
第3步:将new_table重命名为old_table的名称
RENAME TABLE new_table TO old_table;
答案 2 :(得分:0)
我使用的查询通常类似于
Delete from table where id in (
Select Max(id) from table
Group by (DUPFIELD)
Having count (*)>1)
你必须多次运行它,因为它一次只删除一个重复的行,但它很快。