我想知道,oracle中的ROWID是增量生成的吗?如果我尝试以下查询
select min(ROWID) from table
我是否总是会获得表中第一个插入行的 ROWID,或者我最终可能也会获得任何随机行的 ROWID?如果有人可以在这方面有所帮助,那将非常有帮助
“最小”rowid可能并不总是提供表中的第一个插入行。从文档中引用:
将 rowid 分配给行块后,rowid 可以在特殊情况下更改。例如,如果启用了行移动,则 rowid 可能会因为分区键更新、闪回表操作、收缩表操作等而改变。如果行移动被禁用,则当使用 Oracle 数据库实用程序导出和导入行时,rowid 可能会更改。
“等等”表示有很多原因会导致rowid发生变化。这可以通过一个小示例轻松演示:
create table tmp_test ( a number );
insert into tmp_test values (1);
select rowid, a from tmp_test;
ROWID A
------------------ ----------
AABo3AAFvAAAda6AAA 1
alter table tmp_test move;
select rowid, a from tmp_test;
ROWID A
------------------ ----------
AABo3BAFvAAAdbjAAA 1
您会注意到在alter table
操作后唯一的 rowid 已更改。
如果 rowid 可以更改并且 Oracle 没有明确保证“最低”rowid 将始终是第一个插入的行,如果需要,您应该有另一种方法来跟踪它。时间戳或递增序列是正常的。
在不参考任何数据的情况下找到第一个插入的行一定是一个非常不寻常的要求。如果这是你正在考虑使用的东西,我会再看看你为什么需要这样做。
min(ROWID)
将始终返回表格的第一行。
对于数据库中的每一行,ROWID 伪列返回该行的地址。Oracle 数据库 rowid 值包含定位行所需的信息:
- 对象的数据对象编号
- 行所在的数据文件中的数据块
- 该行在数据块中的位置(第一行为0)
- 行所在的数据文件(第一个文件是 1)。文件号是相对于表空间的。
通常,rowid 值唯一标识数据库中的一行。但是,在同一个簇中一起存储的不同表中的行可以具有相同的 rowid。
更多详细信息,请访问官方网站。