【问题标题】:ROWID changed after an update operationROWID 在更新操作后更改
【发布时间】:2021-11-26 02:59:52
【问题描述】:

我正在自治数据仓库上开发一个应用程序,该应用程序必须使用 rowid 字段来识别必须更新的特定行。不幸的是,我注意到当我更新一行时 rowid 发生了变化。这是预期的吗?有没有办法禁用这种行为?

【问题讨论】:

    标签: oracle oracle-autonomous-db


    【解决方案1】:

    自治数据仓库默认使用混合列压缩压缩所有表。更新此类表中的行可以更改 ROWID。这是一个显示 ROWID 如何变化的示例。

    SQL> create table t as select * from all_objects;
    
    Table created.
    
    SQL> select object_id,rowid from t where rownum=1;
    
     OBJECT_ID ROWID
    ---------- ------------------
         9 AABYq5AAAAAABDTAAA
    
    SQL> update t set object_name='X' where object_id=9;
    
    1 row updated.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> select object_id,rowid from t where object_id=9;
    
     OBJECT_ID ROWID
    ---------- ------------------
         9 AABYq5AAAAAABGVAAA
    

    您可以将表创建为未压缩的以避免它。

    SQL> create table t nocompress as select * from all_objects;
    
    Table created.
    

    或者,作为更好的选择,您可以使用一个或多个列来标识要更新的行,而不是依赖于 ROWID。在上面的示例中,我可以使用 OBJECT_ID 列来查找行,因为该列具有唯一值。

    【讨论】:

    • 请注意,这只是某一行的rowid 更改的原因之一。我知道 ATP 不允许禁用行移动的表。我猜 ADW 也会,但我还没有测试过。不依赖rowid来稳定绝对是正确的做法。
    猜你喜欢
    • 2011-04-18
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2011-12-21
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多