前言
其实解决是否插入反复数据的问题,个别状况下是有两个思路,就像治水一样,第一个就是从源头,第二个就是在水流经的路上。咱们带着这两种思路持续往下看:
问题
在咱们的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_nameFROM studentORDER BY last_name;你也能够应用 GROUP BY 来读取数据表中不反复的数据:SELECT last_name, first_nameFROM studentGROUP 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 studentADD PRIMARY KEY (last_name, first_name);
OK,解决办法这么多,置信能解决你的问题。