MySql删除表中重复数据

有一表中存在大量重复数据 在此记录下我删除表内重复数据的方法

-- 新增测试表
create table basic_farmer
(
id INT(11),
user_name VARCHAR(25),
id_card INT (11)
);

以下以单个字段不能重复测试 

1 首先查询有哪些重复数据 

-- 查询有哪些数据重复(id_card不能重复)
select id_card from basic_farmer 
group by id_card having count(id_card) > 1


-- 查全表中哪些数据重复
select user_name,id_card, id from basic_farmer 
where id_card in 
(select id_card from basic_farmer 
group by id_card having count(id_card) > 1)
ORDER BY user_name;

 

2 查询重复数据的id

-- 查询要删除的id 
select id from 
(select a.id from basic_farmer a left join (
select id_card,min(id) id from basic_farmer 
group by id_card having count(id_card) > 1) b
on a.id_card = b.id_card where a.id != b.id ) as tt

min(id)保留 id较小的一条数据  max(id) 保留id较大的一条数据 

3 删除重复数据

如果这样写会报错

You can't specify target table 'basic_farmer' for update in FROM clause

-- 错误写法
DELETE from basic_farmer where id in (
select a.id from basic_farmer a left join (
select id_card,min(id) id from basic_farmer 
group by id_card having count(id_card) > 1) b
on a.id_card = b.id_card where a.id != b.id)

原因:更新这个表的同时又查询了这个表 可以理解为死锁 mysql不支持这种更新查询同一张表的操作

解决方法:把更新的数据查询出来做一个临时表 然后删除

-- 删除重复数据
delete from basic_farmer where id in (
select id from (select a.id from basic_farmer a 
left join (
select id_card,min(id) id from basic_farmer 
group by id_card having count(id_card) > 1) b
on a.id_card = b.id_card where a.id != b.id ) as tt);

where id in中sql做临时表  防止更新这个表的同时又查询了这个表


最后MySql删除表中重复数据就讲完了 大家根据表和字段 替换sql即可(删除前 表记得备份哦!)

欢迎大家在评论区讨论 有什么问题也可以私信我哦😛

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜の雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值