mysql 删除表中重复数据_mysql 删除表中多余的重复记录

===============================================

2019/7/16_第1次修改           ccb_warlock

===============================================

接着上一个话题(https://www.cnblogs.com/straycats/p/11198340.html),做完了表结构和表内容的备份后,接着就需要删除数据。

然而在删除数据的过程中发现,存在多条相同的业务数据记录到了数据库中(表现为,除了索引字段,其他所有字段的内容完全一致)。这样就导致原本的线性增加趋势更明显,脏数据不仅浪费了空间,更影响了查询的效率。

故还是通过sql语句的处理还删除那些逻辑上重复的数据。

daily_t表结构如下:

字段名

描述

TID

索引id

USER_ID

用户id

STATS_DATE

日期

查看要删除的重复记录(在删除数据前先做查询确认范围)

SELECT *

FROMdaily_tWHERE (USER_ID, STATS_DATE) IN(SELECT *

FROM (SELECT USER_ID, STATS_DATE

FROMdaily_tGROUP BY USER_ID, STATS_DATE

HAVING count(*) > 1) A)AND TID NOT IN(SELECT *

FROM (SELECT min(TID)FROMdaily_tGROUP BY USER_ID, STATS_DATE

HAVING count(*) > 1) B)ORDER BY USER_ID, STATS_DATE;

删除重复的记录(只留有索引最小的记录)

DELETE

FROMdaily_tWHERE (USER_ID, STATS_DATE) IN(SELECT *

FROM (SELECT USER_ID, STATS_DATE

FROMdaily_tGROUP BY USER_ID, STATS_DATE

HAVING count(*) > 1) A)AND TID NOT IN(SELECT *

FROM (SELECT min(TID)FROMdaily_tGROUP BY USER_ID, STATS_DATE

HAVING count(*) > 1) B);

PS.sql语句中之所以对子查询多嵌套了一层(select *)是为了规避mysql不支持在where中进行针对需要删除操作的表的子查询(1093-You can’t specify target table for update in FROM clause),因为多嵌套了一层(select *)后,子查询内操作的是两张临时表A、B,而不是daily_t。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值