如何删除MySQL数据库中的重复行? (保持主ID最低的那个)

时间:2010-11-02 06:35:28

标签: sql mysql database unique

假设我想先选择download_link相同的行。然后,我想保留那个具有最低主要ID的那个,然后扔掉其余的。

是否有一个简单的SQL语句?这会有用吗?

delete from mytable
where id not in
    (select min(id)
     from mytable
     group by download_link);

4 个答案:

答案 0 :(得分:4)

这样的事情应该有效:

DELETE FROM `table` 
WHERE `id` NOT IN (
    SELECT MIN(`id`) 
    FROM `table`
    GROUP BY `download_link`)

为了安全起见,在运行实际删除查询之前,您可能需要执行等效选择以查看删除的内容:

SELECT * FROM `table` 
WHERE `id` NOT IN (
    SELECT MIN(`id`) 
    FROM `table`
    GROUP BY `download_link`)

答案 1 :(得分:2)

您不需要临时表或子查询。您可以通过简单的连接来完成:

DELETE t0
FROM mytable AS t0
JOIN mytable AS t1 ON t1.download_link=t0.download_link AND t1.id<t0.id;

即,“删除具有相同链接和较低ID的另一行的每一行”。

答案 2 :(得分:1)

错误1093会阻止您的方法在MySQL中运行。通过创建临时表来解决此问题:

  CREATE TEMPORARY TABLE table_purge SELECT MIN(id) id FROM table GROUP BY download_link;
  DELETE FROM table where id NOT IN (SELECT id FROM table_purge);

编辑以添加不涉及显式临时表的替代解决方法。可能这是有效的,因为查询执行计划自然会创建一个临时表:

 DELETE table
  FROM table 
  NATURAL JOIN (
      SELECT id, download_link
      FROM table
      NATURAL JOIN (
          SELECT MIN(id) min_id, download_link
          FROM table
          GROUP BY download_link ) table_min
      WHERE id > min_id
  )  table_to_purge;

答案 3 :(得分:0)

尝试以下查询

 delete from table where id not in 
 (select * from 
      (select min(id) from table group by download_link)
 SWA_TABAL)

它适用于mysql 5.0.x