如何根据某些字段删除单表中的重复记录?

维护项目时遇到一些问题,某张表中几乎每一条记录都有一个重复记录,而它们的id和创建时间又不同,原因大概是SQL执行时间过长,一次请求完不成,这期间再进来一个请求,下面的相关操作会插入重复记录。现在需要找出这些重复记录并删除,再想办法解决插入重复的问题。

那么,如何删除单表中的重复记录呢?并且条件是部分字段的值一样才认为是重复记录。

我创建了一个简单的表,来作为例子。

如何根据某些字段删除单表中的重复记录?_第1张图片

repay表  

该表中,我们认为name,age,sex一致为一条重复的记录,应当找出来删除掉。举个例子,id为1和id为2的是一条重复记录,而id为3的那条记录并不算重复记录。表中用other字段表示该表中的其他字段信息,但它并不是构成重复的条件之一。

我们可以使用查询:

SELECT * FROM repay r 
GROUP BY r.name,
r.age,
r.sex 
HAVING COUNT(*)>1

 

我们可以得到如上的查询结果,取得了该表的重复记录,想要删除,如果直接执行以下代码:

DELETE 
FROM
  repay 
WHERE id IN 
  (SELECT 
    id 
  FROM
    repay r 
  GROUP BY r.name,
    r.age,
    r.sex 
  HAVING COUNT(*) > 1)

就会报错。错误代码: 1093     You can't specify target table 'repay' for update in FROM clause。意思就是在同一个语句中,你不能先select出表中某些值再执行更新操作!所以需要加一个中间表

DELETE 
FROM
  repay 
WHERE id IN 
  (SELECT 
    t.id 
  FROM
    (SELECT 
      * 
    FROM
      repay r 
    GROUP BY r.name,
      r.age,
      r.sex 
    HAVING COUNT(*) > 1) AS t)

如何根据某些字段删除单表中的重复记录?_第2张图片

执行完后,可以看到表中已经将重复记录删除。(注意,我定义的重复是指name,age,sex都一致才认为是重复。)

你可能感兴趣的:(数据库-MySQL)