1、rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行。 2、rowid是存储在索引中的一组既定的值(当行确定后)。我们可以像表中普通的列一样将它选出来。 
3、利用rowid是访问表中一行的最快方式。 
4、rowid需要10个字节来存储,显示为18位的字符串。 
rowid的组成结构为: 
data object number(6位字符串)+relative file number(3位字符串)+block number(6位字符串)+row number(3位字符串),如:AAAADeAABAAAAZSAAA 5、我们可以借助oracle提供的包dbms_rowid,来对rowid进行解析从而获取关于行的相关信息: 
bossdb-SQL>select 
2 rowid, 
3 dbms_rowid.rowid_object(rowid) obj_id, 
4 dbms_rowid.rowid_relative_fno(rowid) df#, 
5 dbms_rowid.rowid_block_number(rowid) blknum, 
6 dbms_rowid.rowid_row_number(rowid) rowno 
7 from p_test where rownum<5; 
ROWID OBJ_ID DF# BLKNUM ROWNO 
------------------ ---------- ---------- ---------- ---------- 
AAAQ+tAANAAAC6SAAA 69549 13 11922 0 AAAQ+tAANAAAC6SAAB 69549 13 11922 1 AAAQ+tAANAAAC6SAAC 69549 13 11922 2 AAAQ+tAANAAAC6SAAD 69549 13 11922 3 
我们可以看到,通过rowid_row_number得到的行号是从0开始的,这是和rownum伪列的一个不同之处。我猜测rowid_row_number在求行号的时候是计算首行的偏移量。 一般来说,当表中的行确定后,rowid就不会发生变化。
但当如下情况发生时,rowid将发生改变: 
1、对一个表做表空间的移动后 
2、对一个表进行了EXP/IMP后

解决方案 »

  1.   

    不懂ORACLE的人才用rowid当主键, 用rowid死定了~
      

  2.   

    thank you!
    to sozdream() ,real_name(*真名)
    why?
      

  3.   

    整形一般用:NUMBER()
    字符型一般: VARCHAR2()
    rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置 
    一般的表都用自己的流水号(主键)
      

  4.   

    ROWID用来唯一标识表中的一条记录,是这条数据在数据库中存放的物理地址
    索引组织表使用逻辑ROWID,其他表使用物理ROWID物理ROWID的结构(共18位,每位都是64位编码):
    data object number(1-6位):确定表的信息
    + relative file number(7-9位):相对表空间的数据文件号
    + block number(10-15位):记录存储在数据文件中的第几个BLOCK中
    + row number(16-18位):这条记录是BLOCK中的第几条记录如果定义表的字段类型为rowid ,也可以的
    ex: create table test(id number, row_id rowid);
    但是在插入数据的时候,还不知道数据将要存储到那个段那个数据块上,所以只能通过后期的update 语句写入rowidrowid 是oracle本身提供的一个列,不需要在创建表的时候创建,可以直接使用;
    通过rowid 查询快的原因是: rowid直接给出了数据行在物理上的存储地址,不需要通过扫描表或者访问索引来查询数据行存储的物理地址;
      

  5.   

    也许有很多原因ROWID不能做主键,但我看到这句话时,就觉得肯定不能:
    这句话就是:
    {
    但当如下情况发生时,rowid将发生改变: 
    1、对一个表做表空间的移动后 
    2、对一个表进行了EXP/IMP后
    }做了IMP后ROWID变化,但主键是按照业务逻辑永远不能变化的
      

  6.   

    rowid是Oracle内部的数据类型
    这样定义是画蛇添足:create table test(id number, row_id rowid),而且还得自己维护
    一般来说,记录ID不是表的主键就是外键,为参考完整性考虑rowid当然不能用作主键或者外键
      

  7.   

    用number类型的值,可以自己定义增长的顺序,可以把握,以后查询等也好查询.字段长度也可以定义.rowid列,没有用过.学的时候没有讲过这个类型的.
    rowid是Oracle中的一个伪列,不用存储就可以使用.但不好管理.
    建议用number类型!!
      

  8.   

    用NUMBER吧,自己定的,好管理
      

  9.   

    1,ROWID 最好不要做主键,(但它可以他的唯一信用来更新数据),
    2,ROWID 做主键不是最佳选择,因为当数据导出,再导入时 同一行的 ROWID 发生改变,这对主键与外键对应来说是致命错误!
    3,ROWID 让你的数据库设计与数据库的特性相关,这对数据移植也是致命的,如果要称到sql上呢? 难! (如果要移值数据库同样不要用Orcle的序号,序号这个东西加个表,你自己可以设计的)
    4,ROWID 可读性差,这个就不用说了,最后数据库设计不应当过多使用数据库的独用特性,主键ID请选择 NUMBER类型。这样不管怎么样也不会错,而且number建立索引比字符类型小,并且快!
    -----------------
    NUMBER 类型做主键常用思想:NUMBER(1-9) 占5字符空间,
    NUMBER(10-19) 占9字符空间,
    NUMBER(20-28) 占13字符空间,
    NUMBER(29-38) 占17字符空间,1, ID 长度为 NUMBER(8)  确定数据不多时用, 最大1亿
    2, ID 长度为 NUMBER(10) 最普通的一种,也最常用, 最大100亿
    3, ID 长度为 NUMBER(11) 这样他的位数据与手机长度一样,主键好记忆 最大1000亿
    4, ID 长度为 NUMBER(12) 也比较好记三个四位数据,主键好记忆 最大10000亿
    5, ID 长度为 NUMBER(13) 这样与商品的条形码一样,主键好记忆 最大10万亿
    6, ID 长度为 NUMBER(16) 如果要建数据仓库,这种长度比较好,为了使不同表的数据放在一张表而不重复,前面可加4位表号,4 + 12位
                            如:客户表与员工表合成一张数据仓库表时(因为员工经常也是客户),ID不冲突。
          ID最大10000万亿注意:10 -19长度占空间是一样的(所以尽量长些)。什么时候用NUMBER做ID?实体表(每个表对应一项业务),产口,人员(注意人员编号不是ID),订单表。
    维表,校验性表, 用来存储 地区,城市为什么人员编号不是ID?
    因为ID与业务无关,他代表数据这间的关系,数据不会改变(不般不改变)。
    人员编号是人的代号,只作为显示数据用,编号是唯一,但是编号会改变(做人事系统的人知道),这不适合做主键(如果硬是要用也可行,呵呵)最后注意:ID应当与业务无关。这样可以保证人员编号(产品也有编号)改变不会影响到关系。
      

  10.   

    解释:------------------------
    6, ID 长度为 NUMBER(16) 如果要建数据仓库,这种长度比较好,为了使不同表的数据放在一张表而不重复,前面可加4位表号,4 + 12位
    如:客户表与员工表合成一张数据仓库表时(因为员工经常也是客户)4位表号,是指一般好的设计数据库都会有数据字典的,每张表都有ID,为什么是4位?因为4位
    用来表示表已经足够了,很少有系统超过10000张表的。
    用表号加ID在数据集成时,不会发会数据冲突,可以保证数据的ID唯,就算把数据所有数据数据导入到一张表时也可以保证ID唯一