sql语句
/* MySQL 消弭反复行的一些要领 ---Chu Minfei ---2010-08-12 22:49:44.660 --援用转载请说明出处:http://blog.csdn.NET/feixianxxx */ ----------------悉数字段反复------------------------ --1运用表替换来删除反复项 create table test_1(id int,value int); insert test_1 select 1,2 union all select 1,2 union all select 2,3; --竖立一个和源表构造一样的空的暂时表 create table tmp like test_1; --向暂时表插进去不反复的纪录 insert tmp select distinct * from test_1; --删除原表 drop table test_1; --变动暂时表名为目的表 rename table tmp to test_1; --显现 mysql> select * from test_1; +------+-------+ | id | value | +------+-------+ | 1 | 2 | | 2 | 3 | +------+-------+ --2.增加auto_increment属性列(这个要领只能用于MyISAM或许BDB引擎的表) create table test_1(id int,value int) engine=MyISAM; insert test_1 select 1,2 union all select 1,2 union all select 2,3; alter table test_1 add id2 int not null auto_increment, add primary key(id,value,id2); select * from test_1; +----+-------+-----+ | id | value | id2 | +----+-------+-----+ | 1 | 2 | 1 | | 1 | 2 | 2 | | 2 | 3 | 1 | +----+-------+-----+ delete from test_1 where id2<>1; alter table test_1 drop id2; select * from test_1; +----+-------+ | id | value | +----+-------+ | 1 | 2 | | 2 | 3 | +----+-------+ -------------------部份字段反复--------------------- --1.加索引的体式格局 create table test_2(id int,value int); insert test_2 select 1,2 union all select 1,3 union all select 2,3; Alter IGNORE table test_2 add primary key(id); select * from test_2; +----+-------+ | id | value | +----+-------+ | 1 | 2 | | 2 | 3 | +----+-------+ 我们能够看到 1 3 这条纪录消逝了 我们这里也能够运用Unique束缚 由于有能够列中有NULL值,然则这里NULL就能够多个了.. --2.团结表删除 create table test_2(id int,value int); insert test_2 select 1,2 union all select 1,3 union all select 2,3; delete A from test_2 a join (select MAX(value) as v ,ID from test_2 group by id) b on a.id=b.id and a.value<>b.v; select * from test_2; +------+-------+ | id | value | +------+-------+ | 1 | 3 | | 2 | 3 | +------+-------+ --3.运用Increment_auto也能够就是上面悉数字段去重的第二个要领 --4.轻易毛病的要领 --有些朋侪能够会想到子查询的要领,我们来实验一下 create table test_2(id int,value int); insert test_2 select 1,2 union all select 1,3 union all select 2,3; delete a from test_2 a where exists(select * from test_2 where a.id=id and a.value<value); /*ERROR 1093 (HY000): You can't specify target table 'a' for update in FROM clause*/ 现在,您不能从一个表中删除,同时又在子查询中从同一个表中挑选。 ------------------删除特定反复行-------------- --重要经由过程order by +limit 或许直接limit create table test_3(id int,value int); insert test_3 select 1,2 union all select 1,3 union all select 1,4 union all select 2,3; --这是要保存ID=1 value最小的谁人纪录,删除其他id为的纪录 delete from test_3 where id=1 order by value desc limit 2; select * from test_3; +------+-------+ | id | value | +------+-------+ | 1 | 2 | | 2 | 3 | +------+-------+ 假如你只想删除恣意的纪录 保存一条 就能够去掉order by
相干引荐:
关于消弭反复行的细致引见
消弭数组反复项,而且让键值从新从0最先分列
HTML 外边距折叠,以及消弭的方法_html/css_WEB-ITnose
以上就是MySQL消弭反复行要领分享的细致内容,更多请关注ki4网别的相干文章!