MySQL处理重复数据

在数据表中经常会存在重复的数据,而我们往往要对这些重复数据进行处理,包括:防止表中出现重复数据,查询重复记录,统计重复数据,过滤重复数据,删除重复数据。

防止表中出现重复数据:

若我们如下创建一张表,创建时未设置主键或者索引,则该表允许出现重复记录:

create table person(
first_name varchar(20),
last_name varchar(20),
sex varchar(10)
);

此时使用如下两种方式可以有效防止表中出现重复的数据:

  • 设置指定的字段为PRIMARY KEY
create table person(
first_name varchar(20) not null,
last_name varchar(20) not null,
sex varchar(10),
primary key(first_name,last_name)
);

注:因为此处设置双主键模式来设置数据的唯一性,所以这两个键的默认值不能为null,故都设置为not null

  • 设置UNIQUE索引
CREATE TABLE person(
first_name VARCHAR(20) NOT NULL,
last_name VARCHAR(20) NOT NULL,
sex VARCHAR(10),
UNIQUE(first_name,last_name)
);

查询重复记录:

这里举两个例子:

  • 查询user表中重复的user_name的个数
SELECT user_name,COUNT(*) AS COUNT
FROM USER
GROUP BY user_name HAVING COUNT>1;
  • 查询people表中id相同的所有信息
SELECT * FROM people 
WHERE id IN(SELECT id FROM people GROUP BY id HAVING COUNT(id)>1);

统计重复信息:

以下代码统计person_tbl中first_name和last_name的重复记录数:

SELECT COUNT(*)AS repetitons,last_name,first_name
FROM person_tbl
GROUP BY first_name,last_name
HAVING repetitons > 1;

一般情况下,查询重复的值,请执行以下操作:

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

过滤重复信息:


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

SELECT DISTINCT last_name,first_name
FROM person_tbl
ORDER BY last_name;

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

SELECT first_name,last_name
FROM person_tbl
GROUP BY(first_name,last_name);

删除重复信息:

如果你想删除数据表中的重复数据,可以使用以下SQL语句:

CREATE TABLE tmp SELECT last_name,first_name,sex
FROM person;
GROUP BY (last_name,first_name);
DROP TABLE person;
ALTER TABLE tmp RENAME TO person;

当然,在数据表中添加index和primary key可以更简单的删除表中重复记录:

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

猜你喜欢

转载自blog.csdn.net/TNTZS666/article/details/82081525