再上一篇:12.6DATE、TIMESTAMP和 INTERVAL类型
上一篇:12.7 LOB类型
主页
下一篇:12.9小结
再下一篇:13.1分区概述
文章列表

12.8 ROWID/UROWID类型

Oracle 9i 10g编程艺术:深入数据库体系结构

最后要讨论的数据类型是ROWID和UROWID类型。ROWID是数据库中一行的地址。ROWID中编入了足够 多的信息,足以在磁盘上找到行,以及标识ROWID所指向的对象(表等)。ROWID有一个“近亲”UROWID, 它用于表,如IOT和通过异构数据库网关访问的没有固定ROWID表。UROWID是行主键值的一个表示,因此 , 其大小不定,这取决于它指向的对象。
每个表中的每一行都有一个与之关联的ROWID或UROWID。从表中获取时,把它们看作为伪列(pseudo column),这说明它们并不真正存储在行中,而是行的一个推导属性。ROWID基于行的物理位置生成;它并 不随行存储。UROWID基于行的主键生成,所以从某种意义上讲,好像它是随行存储的,但是事实上并非如 此,因为UROWID并不作为一个单独的列存在,而只是作为现有列的一个函数。
对于有ROWID的行(Oracle中最常见的行“类型”;除了IOT中的行之外,所有行都有ROWID),以前 ROWID是不可变的。插入一行时,会为之关联一个ROWID(一个地址),而且这个ROWID会一直与该行关联, 直到这一行被删除(被物理地从数据库删除)。但是,后来情况发生了变化,因为现在有些操作可能会导致 行的ROWID改变,例如:
在分区表中更新一行的分区键,使这一行必须从一个分区移至另一个分区。 使用FLASHBACK TABLE命令将一个数据库表恢复到以前的每个时间点。
执行MOVE操作以及许多分区操作,如分解或合并分区。 使用ALTER TABLE SHRINK SPACE命令执行段收缩。
如今,由于ROWID可能过一段时间会改变(因为它不再是不可变的),所以不建议把它们作为单独的 列物理地存储在数据库表中。也就是说,使用ROWID作为一个数据库列的数据类型被认为是一种不好的实 践做法。应当避免这种做法,而应使用行的主键(这应该是不可变的),另外引用完整性可以确保数据的完 整性。对此用ROWID类型是做不到的,不能用ROWID创建从子表到一个父表的外键,而且不能保证跨表的 完整性。你必须使用主键约束。
那ROWID类型有什么用呢?在允许最终用户与数据交互的应用中,ROWID还是有用的。ROWID作为行 的一个物理地址,要访问任何表中的某一行,这是最快的方法。如果应用从数据库读出数据并将其提供给 最终用户,它试图更新这一行时就可以使用ROWID。应用这种方式,只需最少的工作就可以更新当前行(例 如,不需要索引查找再次寻找行),并通过验证行值未被修改来确保这一行与最初读出的行是同一行。所以 , 在采用乐观锁定的应用中ROWID还是有用的。