No.2.测试MySQL表中安全删除重复数据只保留一条的相关方法

第二篇文章测试说明
开发测试中,难免会存在一些重复行数据,因此常常会造成一些测试异常.
下面简单测试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.结果


    image.png
  • 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 结果 (其实这里恰好就是整个表了)


    image.png
  • 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 结果 : 执行出现问题;


    image.png
  • 02.3.3 那是什么原因呢?原因:笔者的数据库安全模式较高,为REPEATABLE-READ(可重复读)级别,此模式下可以解决脏读 和 不可重复读 (mysql默认的);
    错误代码:1093,意思就是mysql不允许在查询表的同时对这个表进行删除更新操作是不安全的.

    image.png
    • 02.3.4 那可怎么办?除了降级以外还能怎么办?
      Duang!!Duang!!Duang!!Duang!!
      再来一个副本表"dept2",同时还可以起到备份的作用! 创建的sql在最上面,都在dept后面加个2即可!


      dept2.png

-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重复的行已经没了!!


image.png

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表数据


    image.png
  • 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 结果怎么样 : 符合预期结果


    image.png
    • 03.3.1 单独执行第一个子表中的内容,发现正好筛选出了四个部门,没有人事部和喝茶酱油部这两个.
      想想,GROUP BY X, Y意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里。
      这里的是 GROUP BY dept_name,db_source ,故只选出XY两个字段都相同的才可以放到一块来.
      image.png

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

  • 就像一维数组一样,进行删除操作!
  • mysql貌似也支持写for循环!不过.....用Java不更方便吧!
  • 貌似还真可以, 先把所有mysql表中的数据取出来转换成List<Entity>,然后跑两重for循环遍历List ,如果判断出两个实体符合重复的条件,则一定有一个实体是多余的,则从数据库中移除对应的记录(行)即可!
  • 暴力大法好! 时间上应该不分上下!
  • 我都想好了实现步骤,
    1>取数据: MybatisPlus的baseMapper.selectList() ;
    2>for两重判断实体是否相等,
    2> 如果存在则删除一个即可: baseMapper.deleteById(xxxx) / 同时移除一个实体 两个操作即可.
  • 其他方法也可以哟!
  • 未完待续!!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 9,695评论 0 44
  • 1. 了解SQL 1.1 数据库基础 ​ 学习到目前这个阶段,我们就需要以某种方式与数据库打交道。在深入学习MyS...
    锋享前端阅读 1,037评论 0 1
  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,772评论 5 116
  • tip: windows 系统下的MySQL学习参考资料: 菜鸟教程 1.安装 按照网上的许多教程安装好了MySQ...
    恰皮阅读 1,667评论 0 3
  • 我们住在万达广场边上的维也纳国际酒店,吃喝很方便,但是据说是三四环了,到宽窄巷子要坐地铁,步行10分钟到成都西站口...
    微笑_b9fd阅读 395评论 0 0