`

oracle伪列rowid和rownum

阅读更多

一.什么是伪列RowID?

1.首先是一种数据类型,唯一标识一条记录物理位置的一个id,基于64位编码的18个字符显示。

2.未存储在表中,可以从表中查询,但不支持插入,更新,删除它们的值。

 

二.RowID的用途

1.在开发中使用频率应该是挺多的,特别在一些update语句中使用更加频繁。所以oracleERP中大部份的视图都会加入rowid这个字段。

        在一些cursor定义时也少不了加入rowid。但往往我们在开发过程中,由于连接的表很多,再加上程序的复制,有时忽略了rowid对应的是那一个表中rowid,所以有时过程出错,往往花上很多时间去查错,最后查出来既然是update时带的rowid并非此表的rowid,所以在发现很多次的错误时,重视rowid起来了,开发中一定要注意rowid的匹配。

2.能以最快的方式访问表中的一行。

3.能显示表的行是如何存储的。

4.作为表中唯一标识。

 

三.RowID的组成

        rowid确定了每条记录是在Oracle中的哪一个数据对象,数据文件、块、行上。

        ROWID 的格式如下:

数据对象编号        文件编号        块编号            行编号

OOOOOO             FFF                BBBBBB    RRR

        由 data_object_id# + rfile# + block#+ row#   组成,占用10个bytes的空间,32bit的data_object_id#,10 bit 的 rfile#, 22bit 的 block#,16 bit 的 row#,所以每个表空间不能超过1023个 数据文件。

 

四.RowID的应用

        查找和删除重复记录,当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录。

/*conn scott/tiger
Create table empa as select * from emp;
插入重复记录
insert into empa select * from emp where empno = 7369;
insert into empa select * from emp where empno = 7839;
insert into empa select * from emp where empno = 7934;
*/

1.查找重复记录的几种方法:

        a.查找大量重复记录

select empno from empa group by empno having count(*) >1;
Select * From empa Where ROWID Not In(Select Min(ROWID) From empa GroupBy empno);

        b.查找少量重复记录

select * from empa a where rowid<>(select max(rowid) from empawhere empno=a.empno );

2.删除重复记录的几种方法:

        a.适用于有大量重复记录的情况(列上建有索引的时候,用以下语句效率会很高):

Delete empa Where empno In (Select empno From empa Group By empno HavingCount(*) > 1)
   And ROWID Not In (Select Min(ROWID) From empa Group By empno HavingCount(*) > 1);
  
Delete empa Where ROWID Not In(Select Min(ROWID) From empa Group Byempno);

        b.适用于有少量重复记录的情况(注意,对于有大量重复记录的情况,用以下语句效率会很低):

Delete empa a where rowid<>(select max(rowid) from empa whereempno=a.empno );

 

文章来源:http://blog.csdn.net/heqiyu34/article/details/6773689

分享到:
评论

相关推荐

    oracle_SQL中rowid与rownum的使用

    在Oracle SQL中,`ROWID`和`ROWNUM`是两个非常重要的概念,它们在数据库查询和数据操作中起着至关重要的作用。本文将详细探讨这两个特性,包括它们的定义、用途以及如何在实际场景中有效利用它们。 一、ROWID详解 `...

    oracle_SQL中ROWID与ROWNUM的使用

    在 Oracle SQL 中,`ROWNUM` 是一种特殊的伪列,用于标识查询结果集中的行编号。它常用于实现 TOP-N 查询,即返回结果集中满足特定条件的前 N 条记录。 **特点:** - `ROWNUM` 总是从 1 开始,并且只会随着查询...

    rowid与rownum区别

    ORACLE 中ROWNUM用法总结!数据库管理员及程序开发员必看。

    17.Oracle伪列1

    二、rownum伪列 rownum与rowid不同,它是在查询过程中动态生成的序列号,表示查询结果集中行的顺序。rownum在每次查询时重新计算,且仅对查询结果有效,不反映表的实际行顺序。它从1开始递增,对于每个新行,如果...

    oracle的伪列与分页

    Oracle提供了一些内置的伪列供用户使用,如`ROWID`和`ROWNUM`等,这些伪列可以帮助开发人员更方便地进行查询、排序等操作。 #### 二、ROWID与ROWNUM详解 **ROWID:** - **定义**:ROWID是Oracle中用于唯一标识表中...

    Oracle学习笔记(rownum和rowid)

    Oracle学习笔记(rownum和rowid),有具体的代码案例讲解rownum和rowid

    oracle数据库伪列简单介绍

    通过上面的介绍可以看出,虽然rownum和rowid都是Oracle数据库中的伪列,但它们之间存在着本质的不同: - **含义不同**:rownum表示查询结果集中的行序号,而rowid则是表中行的唯一标识符,代表了行在数据库物理文件...

    oracle_SQL-rowid--rownum.zip_oracle

    `ROWID`是Oracle数据库中一个特殊的伪列,它为每一行数据提供了一个唯一的物理地址,类似于内存中的指针。`ROWID`由一系列字符组成,表示了数据在数据块中的位置。它包含了表空间、段、区、块以及行在块内的偏移量等...

    oracle伪列以及伪表.doc

    Oracle数据库系统包含一组特殊的列,被...总之,Oracle的伪列和伪表是其强大功能的一部分,ROWID尤其在数据定位和处理重复数据时发挥着关键作用。理解并熟练运用这些特性,可以极大地提升数据库操作的效率和准确性。

    oracle伪列以与伪表.doc

    Oracle数据库系统中,伪列和伪表是其特有的概念,用于增强数据库的功能和操作灵活性。伪列不是用户在创建表时定义的列,而是Oracle系统自动生成的特殊列,它们提供了额外的信息或功能。以下是关于Oracle伪列和伪表的...

    oracle伪列以及伪表.docx

    Oracle数据库系统中,伪列和伪表是两个特殊的概念,它们为数据库操作提供了额外的功能和便利。本文将详细探讨这两个概念及其应用场景。 首先,我们来理解什么是伪列。伪列并非用户在创建表时定义的列,而是Oracle...

    在oracle中灵活使用Rownum和rowId

    ### 在Oracle中灵活使用Rownum和RowId 在Oracle数据库中,`ROWNUM` 和 `ROWID` 是两个非常重要的概念,它们可以帮助我们在查询数据时实现更灵活的数据管理。本文将详细介绍这两个概念的区别及其使用方法,并通过...

    rowid与rownumber

    rowid 和 rownum 是 Oracle 数据库中的两个重要概念,对于数据库开发人员来说非常重要。下面我们将详细介绍 rowid 和 rownum 的概念、结构、应用场景等。 一、rowid 概念 rowid 是 Oracle 数据库中的一个虚列,...

    对于 Oracle 的 rownum 问题

    =),并非说用&gt;,&gt;=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇,同样是伪列,rownum 与 rowid ...

    关于oracle的rownum

    Oracle ROWNUM 伪列详解 Oracle 的 ROWNUM 伪列是一个非常重要的概念,它对结果集加的一个伪列,即先查到结果集之后再加上去的一个列。了解 ROWNUM 的意义是非常重要的,否则可能会出现莫名其妙的结果。 ROWNUM ...

    Oracle查询语句中rownum与rowid的不同之处分析

    本文主要是以实例形式介绍了Oracle查询中rownum与rowid的不同之处,以及以假设的方式为例,查询条件为rownum = 2,在查询出第一条记录时的具体内容的介绍。 在查询中,我们可以注意到,类似于 select xx from ...

    oracle rownum 学习

    这是因为ROWNUM是一个总是从1开始的伪列,Oracle认为`ROWNUM&gt;n`(n&gt;1的自然数)这种条件不成立。可以使用子查询方法来解决,例如: ```sql SELECT * FROM ( SELECT ROWNUM NO, ID, NAME FROM STUDENT ) WHERE NO &gt; 2;...

Global site tag (gtag.js) - Google Analytics