Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 为什么可以';我们不能使用ROWID作为主键吗?_Oracle_Primary Key_Rowid - Fatal编程技术网

Oracle 为什么可以';我们不能使用ROWID作为主键吗?

Oracle 为什么可以';我们不能使用ROWID作为主键吗?,oracle,primary-key,rowid,Oracle,Primary Key,Rowid,据 您不应该将ROWID用作表的主键。如果你删除 并使用导入和导出实用程序重新插入一行,例如, 那么它的rowid可能会改变。如果删除一行,则Oracle可能会 将其rowid重新指定给稍后插入的新行 我不明白真正的原因。这是否意味着,当我们使用导入/导出实用程序时,只有我们不应该使用ROWID作为主键,或者我们永远不应该使用ROWID作为主键 如上所述,当我们删除该行并重新插入时,相同的ROWID可能会被赋值,但在另一侧,该行已被删除,因此,如果我们获得相同的ROWID,则不会有任何问题。不是

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

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


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

如果重建表,那么表的ROWID可能会更改,并且您不想更改主键

此外,如果删除一条记录,则可以为新记录提供该ROWID。您还应该了解,ROWID不会在数据库导出和导入过程中持久化

如果移动了行,则ROWID将更改。行可以移动,因为 收缩和工作台移动等维护操作。因此, 长时间存储rowid是个坏主意。他们应该 只能在单个事务中使用,最好作为SELECT的一部分 ... 对于更新,行被锁定,阻止行移动


我们决不能将rowid用作永久性和重要业务数据的主键

ROWID是一行的技术地址。有几个场景是什么时候

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

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

例如,若您对表进行了分区,那个么更新记录的分区键将导致记录的rowid发生变化。这样的场景会阻止我们使用ROWID键,除非我们可以忘记它而不会造成严重后果


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

在删除场景中,想象一下其他表中通过ROWID引用原始行的所有数据会发生什么情况。如果我们使用了
级联删除
,那么?是的。或者,如果您在使用相同引用的另一个系统中有数据。导出/导入场景并不是导致rowid更改的唯一场景。表移动(“reorg”)也可以。不能使用rowid创建实际的主键(会得到“无效标识符”);所以我认为这意味着不这样对待is,假设它永远不会改变()。但显然,这只能发生在启用“启用行移动”的情况下。。。