MYSQL 删掉重复行,保留唯一值
今天遇到这个问题,然后做出自己解决方法,其中有些问题值得记录。
原理:
a)建立一个相同结构的空表 b,然后存入有重复记录的name;
b)删掉原来表a 中有重复的记录,(记录在临时表 b),因为不能在自身select update同时运行
c)从临时表 b 取回记录。
步骤:
0.这里以最简单的单个字段“name”重复为例子,更加复杂的结果也是类似,只需要多价一个和 name 样的 条件。
1. 建立测试表
create table user_2 (
id int(11) primary key auto_increment,
name VARCHAR(20) not null default '',
key(name)
)
engine=myisam default charset=utf8;
2.存入测试数据
insert into user_2 (name)
values
('化学'),('体育'),('历史'),
('地理'),('语文'),('化学'),
('绘画'),('生物'),('物理'),
('绘画'),('体育'),('生物'),
('历史'),('物理'),('生物'),
('化学'),('英语'),('语文'),
('理科'),('化工'),('考古');
3. 相同name 的记录种数,7 ,这7类都有记录需要处理。
select id,name from user_2 group by name having count(name)>1
//用 group by 和having count(name) 一起 可以计算哪些,name 有重复
4.以 name 为单元的数目,12,那么我们最后的记录也应该是这12行
select id,name from user_2 group by name
5.建立一个和 测试表完全一样的表,并且存入有重复的“name”记录的数据 7条
create table user_2_tmp as (
select id,name from user_2 group by name having count(name)>1
)
6.删掉有 临时表,有记录的 name,也就是,删掉所有有重复的记录。
delete from user_2 where name in(
select name from user_2_tmp
)
7.从 临时表,把唯一重复的记录,取回来
insert into user_2(name) select name from user_2_tmp
8. 验证数据 ,总共 12条,没有重复的记录,成功。。
select * from user_2
select * from user_2 group by name ;
结果和上面的没有 group by完全一致。