有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。
防止表中出现重复数据
你可以在MySQL数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。
让我们尝试一个实例:下表中无索引及主键,所以该表允许出现多条重复记录。
CREATE TABLE person_tbl
(
first_name CHAR(20),
last_name CHAR(20),
sex CHAR(10)
);
如果你想设置表中字段first_name,last_name数据不能重复,你可以设置双主键模式来设置数据的唯一性, 如果你设置了双主键,那么那个键的默认值不能为NULL,可设置为NOT NULL。如下所示:
CREATE TABLE person_tb2 ( first_name CHAR(20) NOT NULL, last_name CHAR(20) NOT NULL, sex CHAR(10), PRIMARY KEY (last_name, first_name)#一种设置数据的唯一性方法是添加一个UNIQUE索引,unique(last_name,first_name) );
我们发现在表1种插入insert into person_tb1(last_name,firsr_name)values('alex','connor'),然后插入重复多次,发现都已经插入成功
而在表二中插入insert into person_tb1(last_name,firsr_name)values('alex','connor'),同样插入第二次,就会报错,是因为设置了唯一性!
可以使用insert into ignore person_tb1(last_name,firsr_name)values('alex','connor'),插入第二次,并不会报错
NSERT IGNORE INTO与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。
这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的!
统计重复数据:select first_name,last_name,count(*) as repetitions from person_t1,
group by frist_name,last_name,
having repetitions>1
过滤重复数据:select distinct first_name from person_t1