|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
MySQLAB公司的一个高级开发者者表示,“这个特点使得MySQL可以根据你当前的系统的需要来进行调整。”oracle|计划|数据|反复我们大概会呈现这类情形,某个表本来计划不全面,招致内外面的数据数据反复,那末,怎样对反复的数据举行删除呢?
反复的数据大概有如许两种情形,第一种时表中只要某些字段一样,第二种是两行纪录完整一样。
1、关于部分字段反复数据的删除
先来谈谈怎样查询反复的数据吧。
上面语句能够查询出那些数据是反复的:
- select字段1,字段2,count(*)from表名groupby字段1,字段2havingcount(*)>1
复制代码
将下面的>号改成=号就能够查询出没有反复的数据了。
想要删除这些反复的数据,可使用上面语句举行删除
- deletefrom表名awhere字段1,字段2in(select字段1,字段2,count(*)from表名groupby字段1,字段2havingcount(*)>1)
复制代码
下面的语句十分复杂,就是将查询到的数据删撤除。不外这类删除实行的效力十分低,关于年夜数据量来讲,大概会将数据库吊逝世。以是我倡议先将查询到的反复的数据拔出到一个一时表中,然后对举行删除,如许,实行删除的时分就不必再举行一次查询了。以下:
- CREATETABLE一时表AS(select字段1,字段2,count(*)from表名groupby字段1,字段2havingcount(*)>1)
复制代码
下面这句话就是创建了一时表,并将查询到的数据拔出个中。
上面就能够举行如许的删除操纵了:
- deletefrom表名awhere字段1,字段2in(select字段1,字段2from一时表);
复制代码
这类先建一时表再举行删除的操纵要比间接用一条语句举行删除要高效很多。
这个时分,人人大概会跳出来讲,甚么?你叫我们实行这类语句,那不是把一切反复的全都删除吗?而我们想保存反复数据中最新的一笔记录啊!人人不要急,上面我就讲一下怎样举行这类操纵。
在oracle中,有个埋没了主动rowid,内里给每笔记录一个独一的rowid,我们假如想保存最新的一笔记录,
我们就能够使用这个字段,保存反复数据中rowid最年夜的一笔记录就能够了。
上面是查询反复数据的一个例子:
- selecta.rowid,a.*from表名awherea.rowid!=(selectmax(b.rowid)from表名bwherea.字段1=b.字段1anda.字段2=b.字段2)
复制代码
上面我就来说解一下,下面括号中的语句是查询出反复数据中rowid最年夜的一笔记录。
而表面就是查询出除rowid最年夜以外的其他反复的数据了。
由此,我们要删除反复数据,只保存最新的一条数据,就能够如许写了:
- deletefrom表名awherea.rowid!=(selectmax(b.rowid)from表名bwherea.字段1=b.字段1anda.字段2=b.字段2)
复制代码
任意说一下,下面语句的实行效力是很低的,能够思索创建一时表,讲必要判别反复的字段、rowid拔出一时表中,然后删除的时分在举行对照。
- createtable一时表asselecta.字段1,a.字段2,MAX(a.ROWID)dataidfrom正式表aGROUPBYa.字段1,a.字段2;deletefrom表名awherea.rowid!=(selectb.dataidfrom一时表bwherea.字段1=b.字段1anda.字段2=b.字段2);commit;
复制代码
2、关于完整反复纪录的删除
关于表中两行纪录完整一样的情形,能够用上面语句猎取到往失落反复数据后的纪录:
能够将查询的纪录放光临时表中,然后再将本来的表纪录删除,最初将一时表的数据导回本来的表中。以下:
- CREATETABLE一时表AS(selectdistinct*from表名);droptable正式表;insertinto正式表(select*from一时表);droptable一时表;
复制代码
假如想删除一个表的反复数据,能够先建一个一时表,将往失落反复数据后的数据导进光临时表,然后在从一时表将数据导进正式表中,以下:
- INSERTINTOt_table_bakselectdistinct*fromt_table;
复制代码 “通过有能力的DBA的一个简单计划,MySQL可以达到令人难以想像的运行速度,”一位资深DBA如此表示。MySQL中没有多余的功能来拖累CPU或占用内存。 |
|