【问题标题】:why can't we use ROWID as primary key?为什么我们不能使用 ROWID 作为主键?
【发布时间】:2015-04-21 11:42:20
【问题描述】:

根据Oracle Documentation

您不应使用 ROWID 作为表的主键。如果你删除 并使用导入和导出实用程序重新插入一行,例如, 那么它的rowid可能会改变。如果你删除一行,那么 Oracle 可能 将其 rowid 重新分配给稍后插入的新行。

我不明白真正的原因。这是否意味着,当我们使用 Import/Export 实用程序时,只有我们不应该使用 ROWID 作为主键,或者我们永远不应该使用 ROWID 作为主键?

如上所述,当我们删除该行并重新插入时,可能会分配相同的 ROWID,但在另一侧该行已被删除,因此如果我们获得相同的 ROWID 不会有任何问题。不是吗?谁能举个例子来解释一下?

【问题讨论】:

  • 在删除场景中,想象一下其他表中通过其rowid引用原始行的所有数据会发生什么。
  • 如果我们使用了cascade delete 那么?
  • 是的。或者,如果您在另一个使用相同引用的系统中有数据。并且导出/导入场景并不是唯一导致 rowid 更改的场景。表格移动(“重组”)也可以。
  • 你不能使用rowid创建一个实际的主键(你会得到'invalid identifier');所以我认为这意味着不要这样对待,假设它永远不会改变(since it can)。

标签: oracle primary-key rowid


【解决方案1】:

如果你重建你的表,那么表的 ROWID 可能会改变,你不希望你的主键被改变。

此外,如果您删除一条记录,则可以为该 ROWID 指定一条新记录。您还应该了解,ROWID 不会在数据库 EXPORT 和 IMPORT 进程中持续存在。

来自here

如果行被移动,ROWID 将会改变。行可以移动,因为 诸如收缩和表移动之类的维护操作。因此, 长时间存储 ROWID 是个坏主意。他们应该 仅在单个事务中使用,最好作为 SELECT 的一部分 ... FOR UPDATE,行被锁定,防止行移动。

【讨论】:

  • 但显然这只有在启用“启用行移动”时才会发生......
【解决方案2】:

我们不应该将 ROWID 用作永久和业务重要数据的主键。

ROWID 是一行的技术地址。当

a) 现有记录的 rowid 将被更改

b) 不同的记录将具有相同的 rowid。

例如,如果您有分区表,则更新记录的分区键会使我们进入记录的 rowid 更改。这种情况会阻止使用 ROWID 键,除非我们可以忘记它而不会造成严重后果。

ROWID 键可用于不必要的临时数据,例如异常表,或用于短期导航,例如在WHERE CURRENT OF 子句中。

【讨论】:

    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多