【发布时间】:2021-11-26 02:59:52
【问题描述】:
我正在自治数据仓库上开发一个应用程序,该应用程序必须使用 rowid 字段来识别必须更新的特定行。不幸的是,我注意到当我更新一行时 rowid 发生了变化。这是预期的吗?有没有办法禁用这种行为?
【问题讨论】:
标签: oracle oracle-autonomous-db
我正在自治数据仓库上开发一个应用程序,该应用程序必须使用 rowid 字段来识别必须更新的特定行。不幸的是,我注意到当我更新一行时 rowid 发生了变化。这是预期的吗?有没有办法禁用这种行为?
【问题讨论】:
标签: oracle oracle-autonomous-db
自治数据仓库默认使用混合列压缩压缩所有表。更新此类表中的行可以更改 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来稳定绝对是正确的做法。