mysql多主键多数据删除,【mysql】sql删除多个字段重复数据有主键和没主键解决方法...

table user      name age nub      张三    12  23      张三    12  23      张三    12  23      李四    13  21      李四    13  21      王五    11  25

查询重复记录(一条) sql:select * from user group by name,age,nub having count(*)>1;     (如需统计条数请使用conut)

set:      name age nub      张三   12  23      李四   13  21

查询重复记录(所有)

sql:select * from user  a where (a.name,a.age,a.nub)  in (select *  from user group by name,age,nub having count(*)>1);

set      name age nub      张三   12   23      张三   12  23      张三   12  23      李四   13  21      李四   13  21

删除重复记录保留一条  步骤:      1.将查询的数据插入一个新的表中;      2.删除原来的表的数据      3.将新表的数据再插入原表中      4,删除新表

sql:      1. create table new_table (select * from user group by name,age,nub having count(*)>1);        2.delete from user  a where (a.name,a.age,a.nub)  in         (select * from         (select *  from user group by name,age,nub having count(*)>1) as b );

在这里使用了两次select 因为:

delete from user  a where (a.name,a.age,a.nub)  in         (select *  from user group by name,age,nub having count(*)>1);会出现错误

不能对同一表子查询后进行插入或者删除 要在子查询再嵌套一个查询 让对该表查询成为孙查询;

注:这里更正一下,我按照上面的无法执行,要去除a才可以,如下:

delete from user  where (name,age,nub)  in

(select * from

(select *  from user group by name,age,nub having count(*)>1) as b );

3.insert into user (select name,age,nub from new_table);          注意:在插入数据的时候查询表得到字段的顺序要与原表相同否者会出现数据错误;       如果原表数据顺序与新表相同可以用这条语句insert into user (select * from new_table);

4.drop table new_table;

到此完成操作 最后的数据:

table user

name age nub           张三   12   23           李四   13   21           王五   11   25

如果原表中含有主键的话更好操作  不用四条sql语句了 直接执行删除操作  delete from user  a where (a.name,a.age,a.nub)  in     (select name,age,nub from     (select *  from user group by name,age,nub having count(*)>1) as b  )    and id not in(select min(id) from     (select *  from user group by name,age,nub having count(*)>1) as c);

注意事项: 在使用 (name,age,address) in (select *)的时候 * 只能是三列 如果有更多列则 不能使用 *,要明确指出是哪些列;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值