MySQL如何删除重复数据

MySQL中经常会遇到重复的数据,那么当我们遇到重复的时候的时候,如果定位哪些数据是有重复的记录?如何删除重复的数据?我们该怎么做呢?接下来我们一步步来分析一下遇到这样的情况后,该如何处理 。

MySQL如何删除重复数据

文章插图
咋办呢?
初始化实验环境我们创建一个简单的表user_info,然后基于这个表进行分析重复数据的处理情况 。其中的id为自增主键,name、sex、age三个列是我们判断是否为重复数据的key,如果这三列的值相同,则认为这行数据为重复数据 。
  • 建表语句如下:
CREATE TABLE `user_info` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`sex` varchar(255) DEFAULT NULL,`age` int(11) DEFAULT NULL,`remark` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
  • 初始化数据如下:
INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (1, 'A', '男', 22, '第一个A');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (2, 'B', '女', 33, '第一个B');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (3, 'C', '男', 44, '第一个C');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (4, 'D', '女', 55, '第一个D');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (5, 'A', '男', 22, '第二个A');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (6, 'B', '女', 33, '第二个B');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (7, 'C', '男', 44, '第二个C');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (8, 'D', '女', 55, '第二个D');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (9, 'E', '男', 18, '第一个E');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (10, 'A', '男', 22, '第三个A');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (11, 'B', '女', 33, '第三个B');INSERT INTO `tmp_test`.`user_info`(`id`, `name`, `sex`, `age`, `remark`) VALUES (12, 'F', '男', 15, '第一个F');
  • 最后表中数据如下:

MySQL如何删除重复数据

文章插图
初始化的测试数据
明确需求假设我们的要求是保留重复数据中,第一次出现的数据,后面出现的数据不保留 。
也就是我们的上面的这个表中每一组重复数据中id最小的一行数据需要保留,其他比较大的id的重复的数据行需要被删除 。当然如果是要保留id行最大的一行数据最为最后的数据行也是可以了,只要在查询的时候,稍微修改一下SQL语句的min(id)或max(id)函数即可 。
MySQL如何删除重复数据

文章插图
开整
查找重复的数据基于前面我们初始化的实验数据,首先我们要查询出那些数据是有重复数据的行,通过下面的SQL语句,可以得到结果:其中有重复数据的是name值为A、B、C、D的四种类型的数据 。
  • 使用如下SQL可以查询出来那些数据行有重复记录,并统计出重新出现的次数 。
selectname, sex, age,count(*) as count -- 数据重复出现的次数from user_info group by name, sex, age having count(*) > 1;
  • 重复数据在表中的统计结果如下:

MySQL如何删除重复数据

文章插图
数据重复的统计情况
查找要保留的数据上面我们知道该如何查询哪些数据是重复数据了,那么我们需要保留的数据是哪些?
  • 使用下面的SQL既可以获取到我们要保留的数据行:
select * from user_info where id in ( selectmin(id)from user_infogroup by name, sex, age);
  • 结果如下:

MySQL如何删除重复数据

文章插图
每组重复数据中,id值最小的数据行
上面的结果就是我们需要最后留下来的数据 。这里包含了非重复的时候和每一组重复的数据中id最小的数据行 。
删除重复的数据方法一这是最笨的一种方式,也是最容易理解的一种方式,效率也比较低 。思路如下:
MySQL如何删除重复数据


推荐阅读