MySQL数据库,如何处理重复的数据?

数据库 MySQL
这是一个基本问题,这篇文章是我很早之前遇到的一种情况,后来在学习视频的时候又遇到了一次,因此给出一个总结。

 [[378476]]

前言

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

问题

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

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

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

  1. CREATE TABLE student 
  2.     first_name CHAR(20), 
  3.     last_name CHAR(20), 
  4.     sex CHAR(10) 
  5. ); 

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

1、设置双主键模式

  1. CREATE TABLE student 
  2.    first_name CHAR(20) NOT NULL
  3.    last_name CHAR(20) NOT NULL
  4.    sex CHAR(10), 
  5.    PRIMARY KEY (last_name, first_name) 
  6. ); 

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

2、添加unique索引

  1. CREATE TABLE student 
  2.    first_name CHAR(20) NOT NULL
  3.    last_name CHAR(20) NOT NULL
  4.    sex CHAR(10) 
  5.    UNIQUE (last_name, first_name) 
  6. ); 

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

  1. SELECT COUNT(*) as repetitions, last_name, first_name 
  2.        FROM student 
  3.        GROUP BY last_name, first_name 
  4.        HAVING repetitions > 1; 

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

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

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

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

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

我们还是举例说明:

  1. insert ignore into student (last_name, first_name) values ( '张三''李四'); 
  2. //结果 
  3. Query OK, 1 rows affected (0.00 sec) 
  4. insert ignore into student (last_name, first_name) values ( '张三''李四'); 
  5. //结果 
  6. Query OK, 0 rows affected (0.00 sec) 

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

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

方法三:过滤重复数据

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

  1. SELECT DISTINCT last_name, first_name 
  2. FROM student 
  3. ORDER BY last_name; 
  4. 你也可以使用 GROUP BY 来读取数据表中不重复的数据: 
  5. SELECT last_name, first_name 
  6. FROM student 
  7. GROUP BY (last_name, first_name); 

方法四:删除重复数据

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

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

  1. //根据student创建一个临时表,并使用group by过滤了重复数据 
  2.  
  3. CREATE TABLE tmp SELECT last_name, first_name, sex 
  4.         FROM student; 
  5.         GROUP BY (last_name, first_name); 
  6. //删除原student表 
  7. DROP TABLE student; 
  8. //给这个临时表重新命名 
  9. ALTER TABLE tmp RENAME TO stu; 

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

  1. ALTER IGNORE TABLE student 
  2. ADD PRIMARY KEY (last_name, first_name); 

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

 

责任编辑:武晓燕 来源: 愚公要移山
相关推荐

2018-09-11 17:13:23

MySQ数据库重复记录

2018-04-27 13:00:00

数据库MySQL删除重复行

2018-01-24 19:59:03

数据库Oracle坏块

2011-04-07 15:47:28

MySQL数据库

2010-05-31 15:23:02

MySQL数据库NUL

2022-08-16 14:40:09

SQL数据库内存结构

2009-01-11 17:32:03

Oracle数据库重复数据

2010-06-01 17:14:28

2019-08-07 09:52:34

数据库MySQLSQL

2018-01-26 13:28:48

数据库数据重复数据库清理

2017-10-23 16:06:41

数据库MySQL复制中断

2011-07-11 14:36:10

BinlogMysql

2013-06-04 09:16:29

Google存储数据

2011-05-24 14:13:20

Oracle数据库

2021-01-25 06:53:59

前端AJAX技术热点

2011-07-12 16:41:14

mysql处理异常

2011-07-29 11:20:51

MySQL数据库字段重复

2010-06-01 12:51:23

MySQL数据库

2011-03-21 17:00:23

MySQL数据库

2011-05-18 13:16:21

MySQL数据库锁定
点赞
收藏

51CTO技术栈公众号