如何从mysql数据库中删除重复的条目?

37 mysql duplicate-removal

我有一张桌子上有一些ID +标题.我想让标题栏独一无二,但它已经有超过600k的记录,其中一些是重复的(有时是几十次).

如何删除所有重复项,除了一个,所以我可以在标题列之后添加一个UNIQUE键?

unu*_*tbu 79

此命令添加唯一键,并删除所有生成错误的行(由于唯一键).这会删除重复项.

ALTER IGNORE TABLE table ADD UNIQUE KEY idx1(title); 
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,对于某些版本的MySQL ,此命令可能不适用于InnoDB表.有关解决方法,请参阅此帖子.(感谢"匿名用户"提供此信息.)

  • 不适合我.(执行查询重复条目时出错) (9认同)
  • 它不适用于最新版本的MySQL:_作为MySQL 5.7.4,ALTER TABLE的IGNORE子句被删除,并且它的使用会产生错误._ https://dev.mysql.com/doc/refman/5.7/ EN /改变,table.html#修改表索引 (2认同)

nc3*_*c3b 10

创建一个只包含原始表的不同行的新表.可能还有其他方法,但我发现这是最干净的.

CREATE TABLE tmp_table AS SELECT DISTINCT [....] FROM main_table
Run Code Online (Sandbox Code Playgroud)

更具体地说:
更快的方法是将不同的行插入临时表中.使用删除,我花了几个小时从一个800万行的表中删除重复项.使用insert和distinct,只花了13分钟.

CREATE TABLE tempTableName LIKE tableName;  
CREATE INDEX ix_all_id ON tableName(cellId,attributeId,entityRowId,value);  
INSERT INTO tempTableName(cellId,attributeId,entityRowId,value) SELECT DISTINCT cellId,attributeId,entityRowId,value FROM tableName;  
DROP TABLE tableName;  
INSERT tableName SELECT * FROM tempTableName;  
DROP TABLE tempTableName;  
Run Code Online (Sandbox Code Playgroud)