sqlserver、mysql删除重复数据

前言

老是有些项目忘记加唯一索引,如果项目正常运行倒也没事,但是一旦高并发或者服务器带宽波动,极可能出现重复数据,需要手动删除一下

最主要的还是别懒!索引一定要加,索引能将查询速度直接提高100倍


1、表结构
CREATE TABLE [dbo].[met_treasure_hunt_box_rec](
	[rec_id] [int] IDENTITY(1,1) NOT NULL,
	[userCode] [nvarchar](20) NULL,
	[box_type] [int] NULL
	)

userCode,box_type两个字段需要加联合唯一索引,语法如下:
@>_<当初加上也没下面什么事了,

alter table 表名 add unique index 索引名(字段1,字段2,字段3)
2、sqlserver删除重复数据

大概的意思:
通过userCode、box_type 进行分组,查询分组中数量大于2的记录的主键id,每次只取每个分组中的第一条,得到一个id数组,然后delete in 删除
这个sql每执行一次,就会删除每个重复分组中的第一条
注:如果不加 top 1000 会报错,因为子查询使用了group by 必须要指定返回行数,根据数据量定就行

select top 1000  ( 

select top 1 rec_id from met_treasure_hunt_box_rec b where a.userCode=b.userCode and a.box_type=b.box_type

) rec_id from met_treasure_hunt_box_rec a group by a.userCode,a.box_type having count(1)>1 order by count(1) desc 

)

3、mysql删除重复数据

废话不多说,直接上代码!!!

delete from ea_dyh_joke where joke_id in (
  select m.joke_id from (
    select joke_id from ea_dyh_joke  GROUP BY title,text having count(1)>1 order by count(1)
  ) m
)

mysql有点特殊,如果不中间加m表,会报错【不能依据某字段值做判断再来更新某字段的值】加一个中间表即可

You can’t specify target table ‘ea_dyh_joke’ for update in FROM clause

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值