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