关于mysql:mysql数据库如何处理重复的数据

38次阅读

共计 2073 个字符,预计需要花费 6 分钟才能阅读完成。

前言

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

问题

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

正文完
 0