ROWID(oracle) - 任何用途吗?

use*_*280 35 database oracle rowid

我的理解是ROWID是查询返回的结果中每一行的唯一值.

为什么我们需要这个ROWID?ORACLE已经有了ROWNUM.

有没有人在SQL查询中使用过ROWID?

APC*_*APC 44

ROWID是行的物理位置.因此,它是定位行的最快方法,甚至比主键查找更快.所以它在某些类型的事务中很有用,我们选择一些行,存储它们的ROWID,然后在where针对这些相同行的DML子句中使用ROWID .

当我们使用WHERE CURRENT OF更新锁定的行时,Oracle SELECT ... FOR UPDATE语法隐式使用ROWID.此外,EXCEPTIONS表(在使用EXCEPTIONS INTO子句应用约束时引用)具有列ROW_ID.这允许我们快速识别破坏我们约束的行.

后一个例子指出了另一个一般用法:当我们编写一些通用代码时,需要一种存储UID的机制,而不用担心数据类型,复合键等.

另一方面,ROWNUM是一个伪列,用于标记给定结果集中的行.它没有永久的意义.

编辑

给定记录的ROWID可以在系统的生命周期内更改,例如通过表重建.此外,如果删除一个记录,则可以给出ROWID的新记录.因此,ROWID不适合长期用作UID.但它们足以在交易中使用.


use*_*280 12

我现在知道一个例子.

假设你有没有主键的表.所以这个表可以有重复的行.你会如何删除重复的行,但保持其中一种?

Oracle提供ROWID作为主键的替代品.您可以编写一个相关类型的嵌套查询[(按行中所有列分组并在内部查询中的每个组中取MIN(ROWID),对于每个组,删除外部查询中组中的其他行)]

SQL> select * from employees;

       SSN NAME
---------- ----------
         1 helen
         1 helen
         2 helen
         2 peter
        10 sally
        11 null
        11 null
        12 null

8 rows selected.

SQL> delete from employees where ROWID NOT IN (select min(ROWID) from employees
group by ssn,name);

2 rows deleted.

SQL> select * from employees;

       SSN NAME
---------- ----------
         1 helen
         2 helen
         2 peter
        10 sally
        11 null
        12 null

6 rows selected.
Run Code Online (Sandbox Code Playgroud)


Ran*_*ndy 6

请注意,ROWID不会在数据库EXPORT和IMPORT周期中持续存在.你永远不应该在表中存储rowid作为键值.