MySQL数据库,如何处理重复的数据?
前言
这是一个基本问题,这篇文章是我很早之前遇到的一种情况,后来在学习视频的时候又遇到了一次,因此给出一个总结。其实解决能否插入重复数据的问题,一般情况下是有两个思路,就像治水一样,第一个就是从源头,第二个就是在水流经的路上。我们带着这两种思路继续往下看:
问题
在我们的mysql数据库中,经常会出现一些重复的数据,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。我们如何去处理呢?
方法一:防止出现重复数据
也就是说我们再设计表的时候,就应该对这些数据设置一个UNIQUE 索引,在插入的时候就可以保证其唯一性,也就不存在有重复的数据了。当然你也可以直接设置为PRIMARY KEY(主键)。效果也是一样的。我们看一个案例:下表中无索引及主键,所以该表允许出现多条重复记录。
- CREATE TABLE student
- (
- first_name CHAR(20),
- last_name CHAR(20),
- sex CHAR(10)
- );
目前first_name,last_name是可以重复的,如果不想重复这里有两个解决办法:
1、设置双主键模式
- CREATE TABLE student
- (
- first_name CHAR(20) NOT NULL,
- last_name CHAR(20) NOT NULL,
- sex CHAR(10),
- PRIMARY KEY (last_name, first_name)
- );
现在就无法插入重复数据了。
2、添加unique索引
- CREATE TABLE student
- (
- first_name CHAR(20) NOT NULL,
- last_name CHAR(20) NOT NULL,
- sex CHAR(10)
- UNIQUE (last_name, first_name)
- );
这两种看起来形式好像有一点区别,但是能起到相同的作用。此时我们可以插入两条重复的数据,会发现报错。当然我们还可以在数据库中去验证一下:
- SELECT COUNT(*) as repetitions, last_name, first_name
- FROM student
- GROUP BY last_name, first_name
- HAVING repetitions > 1;
在这里我们统计的是 first_name 和 last_name的重复记录数,上面已经用两种方法设置了,这里肯定就是0了。
方法二:在插入时指定能否插入重复数据
在这里我们使用的是Insert ignore into 与Insert into指令。
(1)Insert ignore into会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。
(2)Insert into则直接相反,会直接插入数据,不管数据库里面是否含有重复数据。
我们还是举例说明:
- insert ignore into student (last_name, first_name) values ( '张三', '李四');
- //结果
- Query OK, 1 rows affected (0.00 sec)
- insert ignore into student (last_name, first_name) values ( '张三', '李四');
- //结果
- Query OK, 0 rows affected (0.00 sec)
现在我们看出来了吧,也就是说在执行第一条插入操作的时候,看到数据库没有,则直接插入一条新纪录,因此一行记录受到影响,但是在第二次插入的时候,数据库已经有一条一样的了,因此便不会插入了,0行受到影响。
当然了还有一个指令也可以完成类似于insert ignore into相似的功能,那就是replace into。他表示的是如果存在primary 或 unique相同的记录,则先删除掉。再插入新记录。
方法三:过滤重复数据
如果你需要读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。
- SELECT DISTINCT last_name, first_name
- FROM student
- ORDER BY last_name;
- 你也可以使用 GROUP BY 来读取数据表中不重复的数据:
- SELECT last_name, first_name
- FROM student
- GROUP BY (last_name, first_name);
方法四:删除重复数据
这种情况其实就相当于,在水的终点处去解决。看下面sql语句:
//根据student创建一个临时表,并使用group by过滤了重复数据
- //根据student创建一个临时表,并使用group by过滤了重复数据
- CREATE TABLE tmp SELECT last_name, first_name, sex
- FROM student;
- GROUP BY (last_name, first_name);
- //删除原student表
- DROP TABLE student;
- //给这个临时表重新命名
- ALTER TABLE tmp RENAME TO stu;
当然你也可以在数据表中添加 INDEX(索引) 和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。方法如下:
- ALTER IGNORE TABLE student
- ADD PRIMARY KEY (last_name, first_name);
OK,解决办法这么多,相信能解决你的问题。
相关文章
- 数据孤岛是业务效率的无声杀手
- 2023展望:新的一年将给大数据分析领域带来什么?
- 阿里云ADB基于Hudi构建Lakehouse的实践
- 大数据在医疗保健领域的使用案例
- 微软增加说明:KB5021751 更新扫描已经 / 即将过时 Office 过程中不会触碰用户隐私
- 2022 Gartner全球云数据库管理系统魔力象限发布 腾讯云数据库入选
- 场景化、重实操,分享一个实时数仓实践案例
- Arctic的湖仓一体践行之路
- 分布式计算MapReduce究竟是怎么一回事?
- 淘系数据模型治理优秀实践
- 大数据分析对医疗保健的影响
- 当我们说大数据Hadoop,究竟在说什么?
- 2022年及以后大数据的五个发展趋势
- 网易严选离线数仓治理实践
- 2023 年数据治理趋势
- 一份“靠谱”的年度经营计划,你学会了吗?
- 漫谈对大数据的思考
- 测试一下,读懂数据的能力,你有吗?
- 用艺术的眼光探索数据之美
- 聊聊数据分析成果如何落地