什么是rowID和rowNum(ROWID vs ROWNUM)?

15

我想知道rowIDrowNUM之间的区别,以及如何在我们的表格中查看它们。

当我执行以下操作时:

SELECT * FROM emp WHERE rownum=1

当我用相同的方法查询rowid时,它会返回一个错误信息:

inconsistent datatypes: expected ROWID got NUMBER

并且在某些表中,rownum会返回null。这是为什么?

请解释一下:rowid与rownum的区别?(演示查询)

谢谢

编辑:需要使用别名来显示ROWIDROWNUM(因为它们是伪列),例如:

SELECT rownum r1, rowid r2 FROM emp


“表中没有这样的列”听起来不像是Oracle错误。您是如何运行这些查询的? - Mureinik
@Mureinik,我现在正在W3schools上运行这些查询。但是即使是Oracle也不支持rownum。 - inityk
1
请注意 - 使用 sqlfiddle.com 进行测试。 - Utsav
4个回答

23

ROWNUM 和 ROWID 都是伪列。

ROWID

对于数据库中的每一行,ROWID 伪列返回该行的地址。

一个示例查询可能是:

SELECT ROWID, last_name  
   FROM employees
   WHERE department_id = 20;

关于rowid的更多信息请参见:https://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns008.htm

ROWNUM

对于查询返回的每一行数据,ROWNUM伪列都会返回一个数字来指示Oracle从表或连接的行集中选择该行的顺序。第一行被选中时ROWNUM为1,第二行为2,以此类推。

您可以使用ROWNUM来限制结果集大小,如下所示:

SELECT * FROM employees WHERE ROWNUM < 10;

关于rownum的更多信息请参见:https://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm

区别

rowidrownum之间的实际区别在于,rowid是该行的永久唯一标识符。但是,rownum是临时的。如果更改查询,则rownum编号将引用另一行,而rowid不会。

因此,ROWNUM是仅适用于特定SQL语句的连续编号。相反,ROWID是行的唯一ID。


4

Rownum (数字) = 输出结果的生成序列号。
Rowid (十六进制) = 在插入行时自动生成。

SELECT rowid,rownum fROM EMP


ROWID ROWNUM                 
----- ---------------------- 
AAAR4AAAFAAGzg7AAA, 1                      
AAAR4AAAFAAGzg7AAB, 2                      
AAAR4AAAFAAGzg7AAC, 3                      
AAAR4AAAFAAGzg7AAD, 4                      
AAAR4AAAFAAGzg7AAE, 5      

Joel:如果EMP表也有一个RowID字段,如何将RowID标识为Oracle生成的RowID? - Jenna Leaf
这个查询在MYSQL中无法工作。错误代码:1054。'field list'中的未知列'rowid'。0.000秒。 - Govind Sharma

1
  1. Rowid提供行或记录的地址。Rownum提供记录数量。
  2. Rowid永久存储在数据库中。Rownum不会永久存储在数据库中。
  3. 每次插入表时,Rowid会自动分配。Rownum是一个动态值,与select语句输出一起自动检索。
  4. 仅用于显示目的。

-1

行 ID 显示行的唯一标识符。rownum 显示唯一的默认数字系列。

select * from emp
where rownum<=5;   (it will execute correctly and gives output first 5 rows in your table )

select * from emp
where rowid<=5;  (wrong because rowid helpful to identify the unique value)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接