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)