前言

这是一个基本问题,这篇文章是我很早之前遇到的一种情况,后来在学习视频的时候又遇到了一次,因此给出一个总结。其实解决能否插入重复数据的问题,一般情况下是有两个思路,就像治水一样,第一个就是从源头,第二个就是在水流经的路上。我们带着这两种思路继续往下看:

问题

在我们的mysql数据库中,经常会出现一些重复的数据,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。我们如何去处理呢?

方法一:防止出现重复数据

也就是说我们再设计表的时候,就应该对这些数据设置一个UNIQUE 索引,在插入的时候就可以保证其唯一性,也就不存在有重复的数据了。当然你也可以直接设置为PRIMARY KEY(主键)。效果也是一样的。我们看一个案例:下表中无索引及主键,所以该表允许出现多条重复记录。

CREATETABLEstudent

(

first_name CHAR(20),

last_name CHAR(20),

sex CHAR(10)

);

目前first_name,last_name是可以重复的,如果不想重复这里有两个解决办法:

1、设置双主键模式

CREATETABLEstudent

(

first_name CHAR(20)NOTNULL,

last_name CHAR(20)NOTNULL,

sex CHAR(10),

PRIMARYKEY(last_name, first_name)

);

现在就无法插入重复数据了。

2、添加unique索引

CREATETABLEstudent

(

first_name CHAR(20)NOTNULL,

last_name CHAR(20)NOTNULL,

sex CHAR(10)

UNIQUE(last_name, first_name)

);

这两种看起来形式好像有一点区别,但是能起到相同的作用。此时我们可以插入两条重复的数据,会发现报错。当然我们还可以在数据库中去验证一下:

SELECTCOUNT(*)asrepetitions, last_name, first_name

FROMstudent

GROUPBYlast_name, first_name

HAVINGrepetitions > 1;

在这里我们统计的是 first_name 和 last_name的重复记录数,上面已经用两种方法设置了,这里肯定就是0了。

方法二:在插入时指定能否插入重复数据

在这里我们使用的是Insert ignore into 与Insert into指令。

(1)Insert ignore into会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。

(2)Insert into则直接相反,会直接插入数据,不管数据库里面是否含有重复数据。

我们还是举例说明:

insertignoreintostudent (last_name, first_name)values('张三','李四');

//结果

Query OK, 1 rowsaffected (0.00 sec)

insertignoreintostudent (last_name, first_name)values('张三','李四');

//结果

Query OK, 0 rowsaffected (0.00 sec)

现在我们看出来了吧,也就是说在执行第一条插入操作的时候,看到数据库没有,则直接插入一条新纪录,因此一行记录受到影响,但是在第二次插入的时候,数据库已经有一条一样的了,因此便不会插入了,0行受到影响。

当然了还有一个指令也可以完成类似于insert ignore into相似的功能,那就是replace into。他表示的是如果存在primary 或 unique相同的记录,则先删除掉。再插入新记录。

方法三:过滤重复数据

如果你需要读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。

SELECTDISTINCTlast_name, first_name

FROMstudent

ORDERBYlast_name;

你也可以使用 GROUPBY来读取数据表中不重复的数据:

SELECTlast_name, first_name

FROMstudent

GROUPBY(last_name, first_name);

方法四:删除重复数据

这种情况其实就相当于,在水的终点处去解决。看下面sql语句:

//根据student创建一个临时表,并使用group by过滤了重复数据

//根据student创建一个临时表,并使用groupby过滤了重复数据

CREATETABLEtmpSELECTlast_name, first_name, sex

FROMstudent;

GROUPBY(last_name, first_name);

//删除原student表

DROPTABLEstudent;

//给这个临时表重新命名

ALTERTABLEtmp RENAMETOstu;

当然你也可以在数据表中添加 INDEX(索引) 和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。方法如下:

ALTERIGNORETABLEstudent

ADDPRIMARYKEY(last_name, first_name);

OK,解决办法这么多,相信能解决你的问题。

【编辑推荐】

【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0

mysql 创建重复数据库_MySQL数据库,如何处理重复的数据?相关推荐

  1. mysql 创建查询 删除_MYSQL数据库查询删除创建企业基本知识

    数据查询语言(DQL)从表中获取数据 select  + where (位置)  order by(排序)  group by  haveby 查询用户:select user,host,passwo ...

  2. mysql创建gbk库_MYSQL创建utf-8和GBK格式数据库

    MYSQL创建utf-8格式的数据库 先mysql进入: 代码 GBK: create database test2 DEFAULT CHARACTER SET gbk COLLATE gbk_chi ...

  3. mysql特殊字段名称_Mysql必读MySQL创建带特殊字符的数据库名称方法示例

    <MysqL必读MysqL创建带特殊字符的数据库名称方法示例>要点: 本文介绍了MysqL必读MysqL创建带特殊字符的数据库名称方法示例,希望对您有用.如果有疑问,可以联系我们. 文章抓 ...

  4. mysql 数据库名称 特殊字符_Mysql必读MySQL创建带特殊字符的数据库名称方法示例...

    <Mysql必读MySQL创建带特殊字符的数据库名称方法示例>要点: 本文介绍了Mysql必读MySQL创建带特殊字符的数据库名称方法示例,希望对您有用.如果有疑问,可以联系我们. MYS ...

  5. 如何用mysql创建股票数据库_mysql数据库创建表

    Mysql错误代码大全 1016错误:文件无法打开,使用后台修复或者使用phpmyadmin进行修复. 1044错误:数据库用户权限不足,请联系空间商解决 1045错误:数据库服务器/数据库用户名/数 ...

  6. MySQL创建函数和存储过程,批量插入大数据

    工作中使用Jmeter压测时,需要大数据量,可以使用MySQL创建函数和存储过程,批量插入大数据 右击新建函数,创建过程 完成后自动创建 在body部分写入过程: DECLARE id INT DEF ...

  7. mysql 过滤相同数据库_MySQL数据库查询中的重复记录过滤

    今天帮别人修改程序,需要分组去最大值.也就是所谓,某一字段有重复字,过滤掉有重复的数据.弄了半天,最后总结一下. 首先搞点模拟数据出来 create table t2 ( id int primary ...

  8. mysql 创建相同数据库_mysql数据库找出相同数据MySQL常用操作

    一.MYSQL的命令行模式的设置:桌面->我的电脑->属性->环境变量->新建-> Path=";pathmysqlbin;"其中path为MySQL ...

  9. 优化mysql数据库_MySQL数据库优化技巧大全

    简介:MySQL数据库优化技巧大全 MySQL优化三大方向 ① 优化MySQL所在服务器内核(此优化一般由运维人员完成). ② 对MySQL配置参数进行优化(my.cnf)此优化需要进行压力测试来进行 ...

最新文章

  1. 如何健壮你的后端服务
  2. Laravel 向视图传递变量的3种方法
  3. [BZOJ4994] [Usaco2017 Feb]Why Did the Cow Cross the Road III(树状数组)
  4. 【IP地址の乾坤大挪移】C语言实现“IP地址/数字”互转
  5. 可以ping通 但ssh: connect to host 192.168.0.2 port 22: Connection refused
  6. 平均负载及CPU上下文切换
  7. Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别
  8. 百度服务器临时文件多久一删,百度站长提醒:11月9日前尽快删除超出站点配额的历史sitemap文件...
  9. dbeaver导出建表语句_「mysql基础」MySQL常用语句命令总结(文字版)
  10. linux访问ftp服务器命令
  11. 两周搞定计算机专业毕业设计,附源码+论文+答辩
  12. IntelliJ IDEA文件模板变量
  13. html盒子背景图,CSS盒子模型以及背景图
  14. 英语汉语对比学习:名词(一)
  15. UNIX环境高级编程-第六章-系统数据文件和信息
  16. Java处理音频文件wav转mp3/mp3转wav
  17. php评论表情包怎么引入,WordPress中添加自定义评论表情包的方法
  18. vim编辑器替换以及全局替换
  19. 七夕礼物 | 全网最火的钉子绕线图制作教程
  20. linux安装firefox

热门文章

  1. 今天老板送了我一本书,说让我学习怎么用Python做表格…
  2. HTML5网页设计基础——精美电商悬浮窗
  3. 华为k662c的虚拟服务器,华为k662c光猫怎么样? 华为K662c拆机技巧
  4. USGS上下载的Landsat数据ENVI无法正常打开解决方法
  5. 动态树(LCT)初探
  6. 基于python简易小说阅读器(一)
  7. 数据结构应用题第三章栈和队列代码c
  8. matlab某分子由25个原子组成,清华大学数学实验-实验7无约束优化1
  9. 百慕大神秘三角神秘事件视频
  10. Linux下svn报错:Can‘t create temporary file from template ‘/tmp/svn-XXXXXX‘: Permission denied