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

2019-05-05  本文已影响0人  山枫叶纷飞

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

也就是说,一个部门名只用占一行就可以了,多行的话岂不是浪费了!
SELECT  d.dept_name
    FROM `dept` d
    GROUP BY d.`dept_name` 
    HAVING  COUNT(dept_name) > 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    
);  
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.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都重复的话,那么必定有一项为重复的没有意义的! 既然没有意义,那就删除了!
/*清空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');
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);

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

上一篇 下一篇

猜你喜欢

热点阅读