24、处理重复数据

蓝咒 提交于 2019-12-01 09:28:34

处理重复数据

1、防止表中出现重复数据

你可以在 MySQL 数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。

1.1、 使用 primary key 确保数据的唯一性,数据不能为null

CREATE TABLE person_tbl
(
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10),
   PRIMARY KEY (last_name, first_name)
);

insert into person_tbl values ('zhang','san','男');
insert into person_tbl values ('zhang','san','男');
1062 - Duplicate entry 'san-zhang' for key 'PRIMARY'

1.2、 使用 unique 来确保数据的唯一性,数据可以为null

CREATE TABLE person_tbl
(
   first_name CHAR(20),
   last_name CHAR(20),
   sex CHAR(10),
   UNIQUE (last_name, first_name)
);

insert into person_tbl values ('zhang','san','男');
insert into person_tbl values ('zhang',null,'男');

1.3、 insert ignore into 会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。

insert ignore into person_tbl (last_name, first_name) values ('Jay', 'Thomas'); 
insert ignore into person_tbl (last_name, first_name) values ('Jay', 'Thomas');

mysql> select * from person_tbl;
+------------+-----------+------+
| first_name | last_name | sex  |
+------------+-----------+------+
| zhang      | san       | 男   |
| zhang      | NULL      | 男   |
| Thomas     | Jay       | NULL |
+------------+-----------+------+
3 rows in set

1.4、 replace into 如果存在 primary 或 unique 相同的记录,则先删除掉。再插入新记录。

replace into person_tbl (last_name, first_name) values ('Jay', 'Thomas');

mysql> select * from person_tbl;
+------------+-----------+------+
| first_name | last_name | sex  |
+------------+-----------+------+
| zhang      | san       | 男   |
| zhang      | NULL      | 男   |
| Thomas     | Jay       | NULL |
+------------+-----------+------+
3 rows in set

2、统计重复数据

mysql> select * from person_tbl;
+------------+-----------+------+
| first_name | last_name | sex  |
+------------+-----------+------+
| zhang      | san       | 男   |
| zhang      | san       | 男   |
| zhang      | san       | 男   |
| Thomas     | Jay       | NULL |
| Thomas     | Jay       | NULL |
| li         | san       | 男   |
| zhang      | si        | 男   |
+------------+-----------+------+
7 rows in set

select count(*) repetitions, last_name, first_name
from person_tbl
GROUP BY last_name, first_name
having repetitions > 1;

+-------------+-----------+------------+
| repetitions | last_name | first_name |
+-------------+-----------+------------+
|           3 | san       | zhang      |
|           2 | Jay       | Thomas     |
+-------------+-----------+------------+
2 rows in set

以上查询语句将返回 person_tbl 表中重复的记录数。 一般情况下,查询重复的值,请执行以下操作:

  • 确定哪一列包含的值可能会重复。
  • 在列选择列表使用COUNT(*)列出的那些列。
  • 在GROUP BY子句中列出的列。
  • HAVING子句设置重复数大于1。

3、过滤重复数据

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

select distinct last_name, first_name from person_tbl;

+-----------+------------+
| last_name | first_name |
+-----------+------------+
| san       | zhang      |
| Jay       | Thomas     |
| san       | li         |
| si        | zhang      |
+-----------+------------+
4 rows in set

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

select last_name, first_name from person_tbl
group by last_name, first_name;

4、删除重复数据

CREATE TABLE tmp 
SELECT last_name, first_name, sex 
FROM person_tbl  
GROUP BY (last_name, first_name, sex);

DROP TABLE person_tbl;

ALTER TABLE tmp RENAME TO person_tbl;

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

ALTER IGNORE TABLE person_tbl ADD PRIMARY KEY (last_name, first_name);

问题?

删除重复数据代码实现不了Operand should contain 1 column(s)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!