欢迎来到天天文库
浏览记录
ID:32367013
大小:50.33 KB
页数:11页
时间:2019-02-03
《rownum与rowid含义》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、首先来说一下rownum与rowid含义: 顾名思义rownum就是行数/行号,而rowid就是编码/编号/唯一识别号,所以他是类似“AAAR8gAAEAAAAErAAK”的编号,注意他是没有先后顺序的,也就是说他和数据入库时间没有任何关系,打个比方:他就像磁盘、内存存储数据用的是16进制的地址一样。他们都是伪列,可以理解成表中的一个列只是他们并不是你创建的。同样是伪列区别是什么呢? rowid是你录入数据时有数据库自动为这条记录添加的唯一的18位编号是一个物理编号用于找到这条记录(顺便说一句这也是为什么数据优调的时候强调尽
2、量使用rowid的原因),他是不会随着查询而改变的除非在表发生移动(比如表空间变化,数据导入/导出以后),才会发生变化。 rownum是根据sql查询后得到的结果自动加上去的,但是他却不受到sql中orderby排序的影响,因为他和rowid的顺序一样是系统按照记录插入时的顺序给记录排的号(顺序的、无跳跃)。 但是如果你想让rownum和orderby一样的顺序那么可以使用子查询,形如:selectrownum,t.*from(select*from表空间名orderby字段名)t 这样的话rownum就是根据该字段进行排序的编号
3、了,为什么会这样呢,本人理解:rownum是根据表记录输出的行号,与筛选语句、排序语句都无关所以当用子查询时等于生成了一个表于是就按照这张表从1开始排序了。同样,也可以用下面要提得到的分析函数中的row_number()over(orderby需要排序的字段名)。 值得一提的是MSSQL是没有rownum和rowid的。 一,什么是伪列RowID?1,首先是一种数据类型,唯一标识一条记录物理位置的一个id,基于64位编码的18个字符显示。2,未存储在表中,可以从表中查询,但不支持插入,更新,删除它们的值。二,RowI
4、D的用途1,在开发中使用频率应该是挺多的,特别在一些update语句中使用更加频繁。所以oracleERP中大部份的视图都会加入rowid这个字段。在一些cursor定义时也少不了加入rowid。但往往我们在开发过程中,由于连接的表很多,再加上程序的复制,有时忽略了rowid对应的是那一个表中rowid,所以有时过程出错,往往发上很多时间去查错,最后查出来既然是update时带的rowid并非此表的rowid,所以在发现很多次的错误时,重视rowid起来了,开发中一定要注意rowid的匹配2,能以做快的方式访问表中的一行。3,能显
5、示表的行是如何存储的。4,作为表中唯一标识。三,RowID的组成rowid确定了每条记录是在Oracle中的哪一个数据对象,数据文件、块、行上。ROWID的格式如下: 数据对象编号 文件编号 块编号 行编号 OOOOOO FFF BBBBBB RRR 由data_object_id#+rfile#+block#+row# 组成,占用10个bytes的空间, 32bit的data_object_id#, 10bit的rf
6、ile#, 22bit的block#, 16bit的row#. 所以每个表空间不能超过1023个数据文件。四,RowID的应用1,查找和删除重复记录 当试图对库表中的某一列或几列创建唯一索引时, 系统提示ORA-01452:不能创建唯一索引,发现重复记录。 /*connscott/tiger Createtableempaasselect*fromemp; 插入重复记录 insertintoempaselect*fromempwhereempno=7369; insertintoempaselec
7、t*fromempwhereempno=7839; insertintoempaselect*fromempwhereempno=7934; */ 查找重复记录的几种方法: 查找大量重复记录 selectempnofromempagroupbyempnohavingcount(*)>1; Select*FromempaWhereROWIDNotIn(SelectMin(ROWID)FromempaGroupByempno); 查找少量重复记录 select*fromempaawhererowid<>(
8、selectmax(rowid)fromempawhereempno=a.empno); 删除重复记录的几种方法: (1).适用于有大量重复记录的情况(列上建有索引的时候,用以下语句效率会很高): DeleteempaWhereempno
此文档下载收益归作者所有