如何在内部生成oracle rowid?

Nit*_*Sen 2 sql oracle rowid

我想知道,oracle中的ROWID是否会逐步生成?如果我尝试下面的查询

select min(ROWID) from table
Run Code Online (Sandbox Code Playgroud)

我总是得到表中第一个插入行的ROWID,或者我可能最终得到任何随机行的ROWID?如果有人可以请光一点,这将是非常有帮助的

Ben*_*Ben 5

"最小"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
Run Code Online (Sandbox Code Playgroud)

您会注意到在alter table操作之后,唯一的rowid已经改变.

如果rowid可以更改,并且Oracle没有明确保证"最低"rowid始终是第一个插入行,则应该有另一种方法来跟踪它,如果需要的话.时间戳或递​​增序列是正常的.

在不引用任何数据的情况下找到第一个插入的行必须是一个非常不寻常的要求.如果这是您正在考虑使用的东西,我会再看看为什么需要这样做.