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 *
FROM daily_t
WHERE (USER_ID, STATS_DATE) IN (
SELECT *
FROM (SELECT USER_ID, STATS_DATE
FROM daily_t
GROUP BY USER_ID, STATS_DATE
HAVING count(*) > 1) A)
AND TID NOT IN (
SELECT *
FROM (SELECT min(TID)
FROM daily_t
GROUP BY USER_ID, STATS_DATE
HAVING count(*) > 1) B)
ORDER BY USER_ID, STATS_DATE;
删除重复的记录(只留有索引最小的记录)
DELETE
FROM daily_t
WHERE (USER_ID, STATS_DATE) IN (
SELECT *
FROM (SELECT USER_ID, STATS_DATE
FROM daily_t
GROUP BY USER_ID, STATS_DATE
HAVING count(*) > 1) A)
AND TID NOT IN (
SELECT *
FROM (SELECT min(TID)
FROM daily_t
GROUP 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。
mysql 删除表中多余的重复记录的更多相关文章
- 删除Mysql数据表中多余的重复记录的sql语句
数据表 sniper_tb 中存在主键 id,字段url,现需要在url字段上添加 unique,但由于url存在重复记录,导致添加失败. 如何删除表中多余的url重复记录,仅保持一条? 思路一 将 ...
- 删除表中多余的重复记录(多个字段),只留有rowid最小的记录
假如表Users,其中ID为自增长. ID,Name,Sex 1 张三,男 2 张三,男 3 李四,女 4 李四,女 5 王五,男 --查找出最小行号ID的重复记录 select Name,Sex,C ...
- 删除表中多余的重复记录,重复记录是根据单个字段(Id)来判断,只留有rowid最小的记录
delete from Resource where Title in (select Title from Resource group by Title having count(Title) & ...
- SqlServer查找表中多余的重复记录
1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId from ...
- mysql 删除表中记录
一.清除mysql表中数据 delete from 表名;truncate table 表名;不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以 ...
- mysql删除表中的记录
大家都知道,在MySQL中删除一个表中的记录有两种方法,一种是DELETE FROM TABLENAME WHERE... , 还有一种是TRUNCATE TABLE TABLENAME. DELET ...
- PHP mysql 删除表中所有数据只保留一条
DELETE FROM `logs` WHERE wangzhi='www.juhutang.com' and id<>101072; 上面这段代码的意思为 删除表logs中 所有字段wa ...
- mysql删除表中重复数据,只保留一个最小的id的记录
语句: delete from table1 where id not in (select minid from (select min(id) as minid from table1 group ...
- MySQL 删除表中所有数据
方法一:使用 delete from [表名] 生成日志 方法二:使用 truncate table [表名] 无日志生成 两种方式删除后再插入数据,第一条id的值不一样 方法一: 方法二 ...
随机推荐
- WebSocket专题(阿里)
我们的项目中使用了websocket 用java-websocket 开源项目做的,阿里的人问我用啥实现的websocket一时没有答上来 回来做了总结: 1.前言 最近有同学问我有没有做过在线咨询功 ...
- 【mybatis源码学习】缓存机制
一.mybatis的缓存 一级缓存:sqlsession级别,默认开启(一个事务内有效)二级缓存: sqlsessionFactory级别,需要手动开启,在xml配置cache节点(依赖事务的执行结 ...
- epool与select有什么区别
select在一个进程中打开的最大fd是有限制的,由FD_SETSIZE设置,默认值是2048.不过 epoll则没有这个限制,它所支持的fd上限是最大可以打开文件的数目,这个数字一般远大于2048, ...
- windows cmd ftp 自动下载
1.编写ftp的bat脚本: set year=%,% set day=%,%%,%%,% mkdir d:\ftp\%,% mkdir d:\ftp\%,%\%,%%,%%,% del d:\ftp ...
- ubuntu 16.04 安装teamviewer
很多人可能会问,为什么要在ubuntu上安装teamview?shell不就够用了吗?但实际上,很多时候,在远程连接linux的时候,我们需要在图形用户界面上进行操作.现在我就遇到了一个实际的问题:每 ...
- laravel jwt实践
laravel版本为5.5 1.使用 composer 安装 composer require tymon/jwt-auth 1.*@rc 2.发布配置文件 # 这条命令会在 config 下增加一个 ...
- python/shell代码片段
查看某模块路径 Bash pip show --files selenium 文件编码转换 Bash convmv -f GBK -t UTF-8 --notest -r ydcz_1/ 查找当前目录 ...
- (CSDN 迁移) JAVA多线程实现-可回收缓存线程池(newCachedThreadPool)
在前两篇博客中介绍了单线程化线程池(newSingleThreadExecutor).可控最大并发数线程池(newFixedThreadPool).下面介绍的是第三种newCachedThreadPo ...
- Java的三大版本
Java的三大版本 Write Once.Run Anywhere JavaSE:标准版(桌面程序,控制台开发......) JavaME:嵌入式开发(手机,小家电......) JavaEE:E企业 ...
- Servlet3.0对异步处理的支持
Servlet工作流程 Servlet 3.0 之前,一个普通 Servlet 的主要工作流程大致如下: Servlet 接收到请求之后,可能需要对请求携带的数据进行一些预处理: 调用业务接口的某些方 ...