甚至我还要把它的值存到其它表中的字段里。
所以要求rowid象主键一样,不能修改。
我能否这样做?

解决方案 »

  1.   

    这个不是好的做法,一般rowid是唯一的,但不同的表存储在同一簇里可能会rowid相等。
      

  2.   

    rowid是存放的该行数据的物理地址,
    这样作我看没问题
      

  3.   

    好问题,
    ROWID是记录物理地址,所以当记录的地址改变,它就改变.
    但是在什么情况下,记录的地址会改变呢?当记录被Update?
    我个人认为,记录的地址不会被改变(即使发生ROW migration )
    请在结贴是把它放入FAQ
      

  4.   

    我可以从特定的表中取数据。不太明白的地方是:这个纪录被修改后,或者这张表的其他数据被修改后,这个地址会不会改变?
    就是说数据已经写入数据库,他会不会像整理磁盘碎片那样给你搬到了别的地方?那样rowid不就改变了吗?
      

  5.   

    ORACLE把ROWID作为其内部算法标示ROW的唯一标示。我也认为没问题
      

  6.   

    rowid当记录创建时产生,一直不变,用户无法修改,只有当使用import,export时才可能修改。
      

  7.   

    For each row in the database, the ROWID pseudocolumn returns a row’s address.
    Oracle9i rowid values contain information necessary to locate a row:
    n The data object number of the object
    n Which data block in the datafile
    n Which row in the data block (first row is 0)
    n Which datafile (first file is 1). The file number is relative to the tablespace.
    Usually, a rowid value uniquely identifies a row in the database. However, rows in
    different tables that are stored together in the same cluster can have the same rowid.
      

  8.   

    SQL> select rowid ,id from zhj;ROWID                      ID
    ------------------ ----------
    AAABwpAACAAAN/SAAA          1
    AAABwpAACAAAN/SAAB          2
    AAABwpAACAAAN/SAAC          3
    AAABwpAACAAAN/SAAD          4
    AAABwpAACAAAN/SAAE          5
    AAABwpAACAAAN/SAAF          6
    AAABwpAACAAAN/SAAG          7
    AAABwpAACAAAN/SAAH          8
    AAABwpAACAAAN/SAAI          9
    AAABwpAACAAAN/SAAJ         10已选择10行。SQL> select * from zhj where rowid='AAABwpAACAAAN/SAAA';        ID NAME                 TYPE
    ---------- -------------------- -----
             1 zhang                aaa01
      

  9.   

    jiezhi兄说得很明白了
    rowid不是操作系统中的地址,而是数据库中的书摘:
    数据库中的每一行都有地址,可用rowid来检索,rowid的格式如下block.row.file
    ......
      

  10.   

    confirmed :
    Rows in different tables that are stored together in the same cluster can have the same rowid
      

  11.   

    碎片整理后,rowid应该不会改变
      

  12.   

    如果rowid是数据库的分配的,那么在我export出来,然后import到数据库后会变吗?如果是按照block.row.file的方式,那是有可能不变的吧
      

  13.   

    rowid你可把它看为一个指针,但它是只在Oracle内部使用,与磁盘整理没有关系。不同版本的Oracle的rowid可能不同,如7.3中使用的是file(绝对文件号),block,row组合成的而在8i中改为oid(通过oid可定位到表空间),file(相对文件号,对同一个表空间中的文件),block,row组合,但也支持7.3中rowid,称为受限rowid。即使发生了行迁移(row migration)时,rowid也是不变的,只是在原数据块留下一个指针指向新的位置,但此时访问此行时需要2个IO操作,影响性能。我不知道楼主为什么要采用这种方法,是为了效率吗?使用这样的方式对数据库维护有不利影响。如果在整理碎片时进行了export再import回来时,rowid会发生了变化,那此时应用程序就会受到影响。如果只是为了效率的话,那可以采用建索引等方法实现。建立这样的方式后,怎样保持数据的一致性,使用触发器还是在应用程序中使用代码实现?这样也太烦琐了吧。如果用数据库自己特性能实现的话就使用,不要自己再去做无用功。与其这样做不如重新定义表结构,优化SQL语句。毕竟通常数据库调优多半都是在应用这一级上完成的。
      

  14.   

    rowid的构成:18个字符
    6个表示段号,3个表示数据文件号,6个表示块号,3个表示行号
      

  15.   

    主要是想使用它它标记一条记录,(比如在jsp页面间转换时的数据传递)
    其实可以用自增一的字段实现,但oracle不想sql server可以自动建立,因此实现起来比较麻烦,正好oracle提供rowid,觉得挺方便!
      

  16.   

    if you don't use cluster table, I think you can do it