在Oracle/SQL中,ROWID的数据类型是什么?这个值是如何存储的?
ROWID数据类型存储与表行在磁盘位置相关的信息。它们还可唯一标识表中的行。ROWID数据类型以十六进制形式存储。
因此,十六进制字符串代表其表中行的唯一地址。
ROWID(自Oracle8称为扩展ROWID,直到Oracle7现在称为受限制的ROWID)存储/编码行的物理位置。
(扩展)ROWID以十六进制格式编码以下字段:OBJID(行所属对象的唯一标识符),FILENO(在创建对象的表空间中的相对文件编号),BLOCKNO(文件内的相对块编号)和ROWNUM(块内相对行号)。
(受限制的)ROWID仅包含FILENO(数据库中的相对文件编号)、BLOCKNO和ROWNUM(与扩展ROWID相同),没有OBJID。
在任何给定时间,ROWID唯一编码数据库中的行(除了共享相同ROWID的聚簇表)。ROWID可能会更改(由于数据库重组),也可能被重新使用(例如,在删除和插入后,新行可能会重用ROWID)。此外,导出/导入表将为表重新分配新的ROWID。
请注意,FILENO在扩展ROWID格式中不一定是每个数据库中唯一的,但由于扩展格式还包含OBJID(唯一标识存储表对象段的表空间),因此我们可以找到唯一的文件。
BLOCKNO在数据库文件中是唯一的,而ROWNUM在数据库块中是唯一的。
例外情况:索引组织表-由于索引重组(叶块的移动),ROWID无法定位到确切的块。
由于数据库重组操作,ROWID可能会更改。