删除表中重复记录的办法

 

例如表 table

id name,age
1  menes 20
2  sky   25
3  menes 20

首先 简单说下group by

如果一个select语句中使用了group by 例如 select name,age from table group by name,age
执行此查询后如果name,age的组合不是只有一条,将只返回相同记录中的第一条记录。
那么,上述select语句(select name,age from table group by name,age)返回的是表table中name,age的组合不重复的所有记

录。也就是如下记录

name  age
menes 20
sky   25

那么select min(id) from table group by name,age返回的是什么样的记录呢?

显而易见是表table中name,age的组合不重复的,如果有重复的,则取对应的id字段最小的所有记录的id。即:

1
2

这样,就得到了删除表中重复记录的sql语句

delete from table where id not in(select min(id) from table group by name,age);

意思是删除table中id 字段 不属于 name,age组合唯一的,也不属于 不唯一记录中id字段最小的 记录。

解释:不属于name,age组合中唯一的,也不属于不唯一记录中id字段最小的,那会是什么?肯定是重复的,且不是id最小的。
删之。呵呵。

对于MySQL中含有大量数据的情况,尤其是需要删除重复记录的时候,可以考虑采用以下几种策略: 1. **使用`DISTINCT`关键字**:如果只需要找到唯一的数据,可以在查询时使用`SELECT DISTINCT`,但这不会直接删除行,只是返回一组唯一的值。 ```sql SELECT DISTINCT * FROM your_table; ``` 2. **创建临时**:先将原始复制到一个新的临时中,然后对新进行去重操作,最后将结果插入回原。这需要谨慎处理以防数据丢失。 ```sql CREATE TEMPORARY TABLE temp_table AS SELECT * FROM your_table; DELETE FROM temp_table WHERE id NOT IN (SELECT MIN(id) FROM temp_table GROUP BY column_to_check); INSERT INTO your_table SELECT * FROM temp_table; ``` 3. **使用`GROUP BY`和`HAVING COUNT(*) > 1`**:这种方法可以帮助你找出重复组,并只保留其中的一条记录。 ```sql DELETE FROM your_table WHERE id NOT IN ( SELECT min(id) FROM ( SELECT id, column_to_check, COUNT(*) FROM your_table GROUP BY column_to_check HAVING COUNT(*) > 1 ) as duplicates GROUP BY id ); ``` 4. **使用分区(Partitioning)**:如果数据量大且分布在不同的分区上,可以分别处理每个分区,降低删除的影响。 5. **批量操作**:利用索引或者其他优化手段,分批处理数据,比如每次处理几千甚至几百条数据,减少单次操作的时间。 请记住,在执行这类操作前,最好先备份数据,以防意外丢失。同时,如果你担心效率问题,可以考虑使用存储过程或者程序化的方式(如Python、PHP等)来实现删除操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值