前言

前段时间,很多人问我能不能写一些数据库的文章,正好自己在测试mysql数据库性能的时候,出现了一个问题,也就是出现了很多重复的数据,想起来自己long long ago写过一篇类似的,仅此就拿来总结了一下。如果你在使用mysql的时候也遇到了这个问题,希望能对你有所帮助。

注意:

这篇文章不是数据库系列的正式文章,有关mysql、MongoDB、redis、oracle等数据库系列的文章正在整理中。

其实解决能否插入重复数据的问题,一般情况下是有两个思路,就像治水一样,第一个就是从源头,第二个就是在水流经的路上。我们带着这两种思路继续往下看:

问题

在我们的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过滤了重复数据

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,解决办法这么多,相信能解决你的问题。

mysql重复记录大于十的数据库_面试官:在使用mysql数据库时,遇到重复数据怎么处理?...相关推荐

  1. mysql重复记录大于十的数据库_MySQL专题10之MySQL序列使用、MySQL处理重复数据、MySQL以及SQL的注入...

    1.MySQL序列使用 -  MySQL序列是一组整数:1,2,3...,由于一张数据表只能有一个字段自增主键,如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. -  使用AUTO ...

  2. redis做mysql缓存的优点_面试官:如何保障数据库和redis缓存的一致性

    随着互联网的高速发展,使用互联网产品的人也越来越多,团队不可避免得也会面对越来越复杂的高并发业务场景(如下图),比如热点视频/文章的观看(读场景),热点视频/文章的评论,点赞等(写场景). 众所周知, ...

  3. mysql自增_面试官:为什么 MySQL 的自增主键不单调也不连续?

    为什么这么设计(Why's THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点.对具体实现造成的影响 ...

  4. mysql一次查询无关联多个表_面试官:为什么mysql不建议执行超过3表以上的多表关联查询?...

    点关注,不迷路:持续更新Java架构相关技术及资讯热文!!! 概述 前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql只有一种表连接类型:嵌套循环 ...

  5. 事物的级别_面试官问:MySQL锁与事物隔离级别你知道吗?

    本文作者:何建辉(公众号:org_yijiaoqian) 点赞再看,养成习惯,微信搜一搜[一角钱小助手]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收 ...

  6. mysql释放练级_面试官:谈谈Mysql事务隔离级别?

    当我们的数据库的引擎是InnoDB的时候. 事务的隔离级别分为:未提交读(read uncommitted).已提交读(read committed).可重复读(repeatable read).串行 ...

  7. mysql 分段执行_面试官问你MySQL的优化,看这篇文章就够了

    作者:zhangqh segmentfault.com/a/1190000012155267 一.EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划. 下面来个简单的示例 ...

  8. mysql数据库事务有几种特性_面试官:你能说说事务的几个特性是啥?有哪几种隔离级别?...

    1.面试题事务的几个特点是什么? 数据库事务有哪些隔离级别? MySQL的默认隔离级别?2.面试官心里分析 用mysql开发的三个基本面:存储引擎.索引,然后就是事务,你必须得用事务. 因为一个业务系 ...

  9. 十年项目经验面试官亲传大数据面试__大数据面试独孤九剑

    文章目录 引言 第一剑「总决式」功能概述(三句话左右概况,简明扼要) 第二剑「破剑式」项目周期(开发时长和人员配置) 开发时长: 人员配置 第三剑「破刀式」技术架构(技术选项及框架版本) 第四剑「破枪 ...

最新文章

  1. 查看器_三款完美替代Windows10自带照片查看器的神器!
  2. centos上安装zookeeper
  3. 申请鸿蒙选择应用程序是什么,申请鸿蒙系统有一个应用选择怎么选择呢
  4. 数据挖掘十大算法之—C4.5
  5. docker copy异常
  6. Rust是如何实现内存安全的--理解RAII/所有权机制/智能指针/引用
  7. [GitHub]一个简单的网络驱动
  8. Python进阶(十二)常用数据处理模块
  9. [spm操作] VBM分析中,modulation的作用
  10. LoRa网关实现水表抄表无线远程数采方案
  11. bugku never_give_up file_get_contents()有php://input漏洞 eregi \x00绕过
  12. Docker技术之容器与外部相连
  13. 2017校园招聘 携程编程题
  14. SSL生成证书的几种方式
  15. 理解O(log2N)和O(Nlog2N)
  16. 局域网内VSS无法连接的一个“恶心他妈给恶心开门”的问题
  17. JavaScript实现购物车计算价格功能
  18. Your account has been blocked问题解决
  19. STM32F429 笔记(一)- Keil 创建HAL工程
  20. C++中compare函数的使用

热门文章

  1. 关于腾讯云丢数据事件的一些看法
  2. java俄罗斯方块旋转,俄罗斯方块旋转算法研究
  3. centos8共享文件夹挂载_CentOS 8 安装并配置NFS服务
  4. 搭建 ELK 集群 kafka filebeat kibana logstash zookeeper elasticsearch
  5. elasticsearch-7.15.2 同时支持中文ik分词器和pinyin分词器
  6. RuoYi-Cloud 部署篇_03(windows环境 mysql版本)
  7. 正则表达式中的开头和结尾
  8. Spring基础环境搭建
  9. idea gblfy常用快捷键
  10. Access中编写VBA代码时,如何区分、使用“.”和“!”