处理重复数据
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)