sql删除重复数据
前言
老是有些项目忘记加唯一索引,如果项目正常运行倒也没事,但是一旦高并发或者服务器带宽波动,极可能出现重复数据,需要手动删除一下
最主要的还是别懒!索引一定要加,索引能将查询速度直接提高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