第二篇文章测试说明

开发测试中,难免会存在一些重复行数据,因此常常会造成一些测试异常.

下面简单测试mysql表删除重复数据行的相关操作.

主要通过一下三个大标题来测试说明:

02.尝试删除dept_name重复的列

03 尝试删除多个字段(dept_name和db_source)都重复的字段!

04 是否可以使用两重for循环来判断是否存在重复行并进行删除!

数据库的表不要随便删除,需要删除部分数据的话请事先备份成SQL,或者创建备份表.不然--

后端一时爽,运维火葬场.

01.建表

(随手找来一个现成的表,直接拷贝出sql语句)
CREATE DATABASE IF NOT EXISTS cloudDB01;

USE clouddb01;

CREATE TABLE IF NOT EXISTS `dept` (
`dept_no` BIGINT(20) NOT NULL AUTO_INCREMENT,
`dept_name` VARCHAR(60) DEFAULT NULL,
`db_source` VARCHAR(60) DEFAULT NULL,
PRIMARY KEY (`dept_no`)
) ENGINE=INNODB AUTO_INCREMENT=278 DEFAULT CHARSET=utf8;
/*插入dept表一系列数据*/
insert into `dept`(`dept_no`,`dept_name`,`db_source`) values
(1,'开发部','clouddb01'),
(2,'人事部','clouddb01'),
(3,'财务部','clouddb01'),
(4,'市场部','clouddb01'),
(5,'运维部','clouddb01'),
(6,'\'喝茶酱油部\'','clouddb01'),
(21,'开发部','clouddb01'),
(22,'人事部','clouddb01'),
(23,'财务部','clouddb01'),
(24,'市场部','clouddb01'),
(25,'运维部','clouddb01'),
(26,'\'喝茶酱油部\'','clouddb01');

02.尝试删除dept_name重复的列

也就是说,一个部门名只用占一行就可以了,多行的话岂不是浪费了!
  • 02.1.1.查询存在dept_name存在重复的行
SELECT  d.dept_name
FROM `dept` d
GROUP BY d.`dept_name`
HAVING COUNT(dept_name) > 1
  • 02.1.2.结果

  • 02.2.1 把上面的表当做子表查出重复的整个行
SELECT *
FROM `dept`
WHERE `dept_name` IN
(
SELECT d.dept_name
FROM `dept` d
GROUP BY d.`dept_name`
HAVING COUNT(dept_name) > 1
);
  • 02.2.2 结果 (其实这里恰好就是整个表了)

  • 02.3.1 上面的结果是不行的,删除时不能都删了,我们为了保留一个行,where条件需要再修改一下保留部门号(dept_no)最小的那行数据好了!
DELETE
FROM
`dept`
WHERE `dept_name` IN (SELECT
dept_name
FROM
`dept`
GROUP BY `dept_name`
HAVING COUNT(dept_name) > 1) AND `dept_no` NOT IN (SELECT
MIN(dept_no)
FROM
`dept`
GROUP BY `dept_name`
HAVING COUNT(dept_name) > 1);
  • 02.3.2 结果 : 执行出现问题;

  • 02.3.3 那是什么原因呢?原因:笔者的数据库安全模式较高,为REPEATABLE-READ(可重复读)级别,此模式下可以解决脏读 和 不可重复读 (mysql默认的);

    错误代码:1093,意思就是mysql不允许在查询表的同时对这个表进行删除更新操作是不安全的.


    • 02.3.4 那可怎么办?除了降级以外还能怎么办?

      Duang!!Duang!!Duang!!Duang!!

      再来一个副本表"dept2",同时还可以起到备份的作用! 创建的sql在最上面,都在dept后面加个2即可!

-02.3.5 Show Time!是不是恍然大悟了!

DELETE
FROM
`dept`
WHERE `dept_name` IN (SELECT
dept_name
FROM
`dept2`
GROUP BY `dept_name`
HAVING COUNT(dept_name) > 1) AND `dept_no` NOT IN (SELECT
MIN(dept_no)
FROM
`dept2`
GROUP BY `dept_name`
HAVING COUNT(dept_name) > 1);

-02.3.6 回头看,不曾走远,dept表中dept_name重复的行已经没了!!

03 尝试删除多个字段(dept_name和db_source)都重复的字段!

目的也就是一个部门实体用这两个字段就可以清楚地区分出来,如何任意两行数据中存在dept_name和db_source都重复的话,那么必定有一项为重复的没有意义的! 既然没有意义,那就删除了!
  • 03.1.1 清空dept表和备份表dept2,dept表的sql如下,dept2的sql简单把下面的表名改一下即可

    注意,人事部和喝茶酱油部这两个的db_source列是油变动的,不然跟上面的表就一模一样了!
/*清空dept表,以及重置自增的主键*/
TRUNCATE dept;
/*插入dept表一系列数据*/
INSERT INTO `dept`(`dept_no`,`dept_name`,`db_source`) VALUES
(1,'开发部','clouddb01'),
(2,'人事部','clouddb02'),
(3,'财务部','clouddb01'),
(4,'市场部','clouddb01'),
(5,'运维部','clouddb01'),
(6,'\'喝茶酱油部\'','clouddb02'),
(21,'开发部','clouddb01'),
(22,'人事部','clouddb01'),
(23,'财务部','clouddb01'),
(24,'市场部','clouddb01'),
(25,'运维部','clouddb01'),
(26,'\'喝茶酱油部\'','clouddb01');
  • 03.1.2 现有dept/dept2表数据

  • 03.2.1 比葫芦画瓢,使用上面的方法试试!同样,如果存在两个列数据重复的行的话,只保留dept_no最小的哪行数据!
DELETE
FROM
`dept`
WHERE `dept_name` IN
/*筛选出存在多列重复的*/
(SELECT
dept_name
FROM
`dept2`
GROUP BY `dept_name`,db_source
HAVING COUNT(dept_name) > 1)
/**保留dept_no最小的那行数据*/
AND `dept_no` NOT IN (SELECT
MIN(dept_no)
FROM
`dept2`
GROUP BY `dept_name`
HAVING COUNT(dept_name) > 1);
  • 03.2.2 结果怎么样 : 符合预期结果

    • 03.3.1 单独执行第一个子表中的内容,发现正好筛选出了四个部门,没有人事部和喝茶酱油部这两个.

      想想,GROUP BY X, Y意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里。

      这里的是 GROUP BY dept_name,db_source ,故只选出XY两个字段都相同的才可以放到一块来.

04 是否可以使用两重for循环来判断是否存在重复行并进行删除!

  • 就像一维数组一样,进行删除操作!
  • mysql貌似也支持写for循环!不过.....用Java不更方便吧!
  • 貌似还真可以, 先把所有mysql表中的数据取出来转换成List,然后跑两重for循环遍历List ,如果判断出两个实体符合重复的条件,则一定有一个实体是多余的,则从数据库中移除对应的记录(行)即可!
  • 暴力大法好! 时间上应该不分上下!
  • 我都想好了实现步骤,

    1>取数据: MybatisPlus的baseMapper.selectList() ;

    2>for两重判断实体是否相等,

    2> 如果存在则删除一个即可: baseMapper.deleteById(xxxx) / 同时移除一个实体 两个操作即可.
  • 其他方法也可以哟!
  • 未完待续!!

【MySQL】测试MySQL表中安全删除重复数据只保留一条的相关方法的更多相关文章

  1. Oralce中SQL删除重复数据只保留一条(转)

    用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 .查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select ...

  2. mysql删除重复数据只保留一条

    mysql删除重复数据只保留一条 新建一张测试表: CREATE TABLE `book` ( `id` char(32) NOT NULL DEFAULT '', `name` varchar(10 ...

  3. oracle删除重复数据只保留一条

    -- 如表role_user的数据 ROLEID USERID -- 删除相同记录只剩下一条记录 根据两个字段查询重复数据 (roleid,userid) ) 删除重复数据只保留一条 delete f ...

  4. MySQL中删除重复数据只保留一条

    用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 SELECT ...

  5. mysql 删除重复数据只保留一条记录

    删除重复数据保留name中id最小的记录 delete from order_info where id not in (select id from (select min(id) as id fr ...

  6. SQL删除重复数据只保留一条

    用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select ...

  7. SQL查找 删除重复数据只保留一条

    --用SQL语句,删除掉重复项只保留一条 --在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 --1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 ...

  8. sql语句(删除重复数据只保留一条)

    用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select ...

  9. mysql——查询重复数据,及删除重复数据只保留一条数据

    查询 text 表中,user_name字段值重复的数据及重复次数 select user_name,count(*) as count from text 删除 text 表中,重复出现的数据只保留 ...

随机推荐

  1. nginx添加sticky模块-cookie保持会话

    cookie不同于session,一个存于客户端,一个存于服务端. 环境nginx 1.8.0 centos6.X sticky:1.2.5  wget https://bitbucket.org/n ...

  2. LVDS接口液晶屏点屏流程

    使用MStar的TSUM系列的芯片,主要是用来驱动LVDS的屏.在硬件设置无误的情况下(屏开关口.屏电压.PWM等),按照屏规格书上的参数配置屏参,就可以完成点屏了.大概分为几个步骤,确定屏供电电压, ...

  3. 【LOJ511】[LibreOJ NOI Round #1]验题(动态DP)

    我这道题写了整!整!三!天! 我要一定要写这篇博客来表达我复!杂!的!心!情! 题目 LOJ511 官方题解(这个题解似乎不是很详细,我膜 std 才看懂的) 调这道题验证了我校某人的一句话:调题是一 ...

  4. Ribbon和Nignx的区别

    Ribbon属于客户端负载均衡:在调用接口的时候,会通过服务别名到eureka上获取服务的信息列表,缓存到jvm本地,在本地采用RPC远程调用技术去调用接口,实现负载均衡.可以设置调用的规则是请求总数 ...

  5. Python实现堆

    堆 (heap) 是一种经过排序的完全二叉树,其中任一非叶子节点的值均不大于(或不小于)其左孩子和右孩子节点的值. 注:定义来自百度百科. 堆,又被为优先队列(priority queue).尽管名为 ...

  6. python ---socket初识

    python网络编程(初识) 一些概念 套接字: 套接字(socket)也叫通信端点,最初用于计算机内部进程之间的通信,而随着网络的发展,套接字被用于计算机之间的通信.举个例子,你(是一台计算机)要打 ...

  7. day07——数据类型补充、坑、二次编码

    day07 数据类型补充 str 首字母大写:capitalize() name = 'alex' name1 = name.capitalize() print(name1) 每个单词首字母大写:t ...

  8. day18——re正则表达式

    day18 re模块--正则表达式 匹配方法 findall():从字符串中全部查找内容,返回一个列表 s = "meet_宝元_meet" print(re.findall(&q ...

  9. 用python读取word文件里的表格信息【华为云技术分享】

    在企查查查询企业信息的时候,得到了一些word文件,里面有些控股企业的数据放在表格里,需要我们将其提取出来. word文件看起来很复杂,不方便进行结构化.实际上,一个word文档中大概有这么几种类型的 ...

  10. 批量关联update

    UPDATE A SET A.field = B.field from table A inner join table B ON A.field = b.field