oracle的rowid和rownum

rowid与rownum都被称为伪列,但它们的存在方式是不一样的,rowid是在数据插入到数据库中时生成的,可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中是唯一的,只要记录没被搬动过,rowid是不变的。rowid 相对于表来说又像表中的一般列,所以以 rowid 为条件就不会有rownum那些莫名其妙的结果出现。
rownum是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是在sql执行时对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。
另外还要注意:rownum不能以任何基表的名称作为前缀。

首先说说rowid,前面说只要记录没被搬动过,rowid就不会变,说明rowid在某些情况下是可以改变的,下面说说rowid的变动情况。
1、数据被删除后rowid可以被重用(摘自http://blog.itpub.net/22111412/viewspace-613623/,下面是按照博主的步骤本人在oracle11g下做的实验,与博主rowid被重用的情况不同,但可以重用)
插入数据后查看rowid如下:
[img]http://dl2.iteye.com/upload/attachment/0115/9288/a2c0dd15-8137-3bfb-8318-abb5772ba5ad.png[/img]
删除id=7的记录,即删除AAAdrUAANAAJ9W3AAG这个rowid
[img]http://dl2.iteye.com/upload/attachment/0115/9290/7e354fcd-8b29-30ba-aa6e-44a257f49660.png[/img]
插入id为11、12,name为test的记录,查询rowid没有被重用
插入id为13,name为空的记录,查询rowid被重用
[img]http://dl2.iteye.com/upload/attachment/0115/9292/7f7bb220-cd54-3c15-97a4-9135b29e91c4.png[/img]

另外本人测试了插入id为11、12时name也为空的情况,也是等到插入第三条记录即id为13时才会重新用被删除的rowid;同样,后插入的三条记录name都为test或比长时也会在第三次重用rowid,可见oracle11g中rowid重用的规则与9i不同,本人环境限制无法导出dump,暂未找到规则

2、扩展数据字段长度,致使当前块容纳不下,需要移到新的块,此种情况下rowid并不会发生变化(摘自http://blog.itpub.net/22111412/viewspace-613500/,本人环境限制,无法导出dump,但是扩展字段内容后查询rowid不会发生变化)
3、通过online shark,rowid会改变(摘自http://blog.itpub.net/22111412/viewspace-613623/,本人在oracle11g环境测试)
4、alter table move会改变rowid(摘自http://blog.itpub.net/22111412/viewspace-613677/)


表1中的唯一(主键)是表2的外键时,使用truncate、delete删除报错问题:
1、表2中有数据,删除表1数据报错:唯一/主键被启用的外键引用
2、删除表2中的数据,使用truncate删除表1数据仍报上述错误,使用delete可以删除表1数据,why?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值