如何从MySQL表中删除重复行

6

我有一个类似于 MySQL 的表:

ID, Col1, Col2, Col3, Col4, etc...

ID是一个主键,自表格创建以来一直在使用。

我想做的是删除除一个记录外其他所有列都相同的记录。


可能是在MySQL中删除重复行的重复问题。 - Basilevs
8个回答

13
DELETE DupRows.*
FROM MyTable AS DupRows
   INNER JOIN (
      SELECT MIN(ID) AS minId, col1, col2
      FROM MyTable
      GROUP BY col1, col2
      HAVING COUNT(*) > 1
   ) AS SaveRows ON SaveRows.col1 = DupRows.col1 AND SaveRows.col2 = DupRows.col2
      AND SaveRows.minId <> DupRows.ID;

当然,你必须在所有三个位置上将col1和col2扩展到所有列。

编辑:我刚从我的脚本中提取了这段代码并重新测试了一下,在MySQL中执行。


1
不使用嵌套选择或临时表。
DELETE  t1
FROM    table_name t1, table_name t2
WHERE   
            (t1.Col1 = t2.Col1 OR t1.Col1 IS NULL AND t2.Col1 IS NULL)
        AND (t1.Col2 = t2.Col2 OR t1.Col2 IS NULL AND t2.Col2 IS NULL)
        AND (t1.Col3 = t2.Col3 OR t1.Col3 IS NULL AND t2.Col3 IS NULL)
        AND (t1.Col4 = t2.Col4 OR t1.Col4 IS NULL AND t2.Col4 IS NULL)
        ...
        AND t1.ID < t2.ID;

我认为如果我们应该基于多个条件删除重复项,这将是完美的。 - Niranjan N Raju

1
  1. RENAME TABLE [table w/ duplicates] TO [temporary table name]

  2. 创建一个与包含重复数据的原始表名相同的完全相同的表。

  3. INSERT INTO [new table] SELECT DISTINCT * FROM [old table with duplicates]

  4. 删除临时表。


0
你可以尝试使用join来实现: 像这样的方式:
DELETE e1 FROM emp_tbl AS e1 JOIN emp_tbl AS e2 WHERE 
e1.Col1=e2.Col1 AND e1.Col2=e2.Col2 AND e1.Col3=e2.Col3 AND e1.Col4=e2.Col4
AND e1.id < e2.id;

0
你可以运行一个修改查询来实现这个功能。
ALTER IGNORE TABLE tbl_1
ADD UNIQUE INDEX unq_idx(col1, col2, col3);

我不能保证它会在重复记录中保留第一条记录,但MySQL通常会这样做。


0
我会用MSSQL的方式来做,但我认为在MySQL中稍作修改应该也可以。这不是可执行的代码,但应该能指明方向。
CREATE TEMPORARY TABLE #Table (Col1, Col2, Col3);
INSERT INTO #Table (Col1, Col2, Col3) SELECT DISTINCT Col1, Col2, Col3 FROM Table;
DELETE FROM Table;
INSERT INTO Table (Col1, Col2, Col3) SELECT Col1, Col2, Col3 FROM #Table;
DROP TABLE #Table;

0

你也可以这样做

Create table new_table{id, col1,col2,col3}

insert into new_table values(select distinct * from old_table)

drop table old_table

1
这并不是一个实际可行的解决方案。对于小型项目来说可能有效,但在生产环境中很快就会开始退化。你要重命名表格,因为有重复的吗?如果旧表格上运行着需要更新以匹配新表格名称的查询代码,那该怎么办? - Dave

0

你可以使用一些函数(如Min,取决于数据库)来删除除一个之外的所有行。

delete from Table_Name
where Id not in
( select min(Id)
from  Table_Name
group by ID, Col1, Col2, Col3, Col4);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接