我有一个oracle表,我从oracle服务器导出数据,然后将数据导入另一个oracle服务器。
我的问题是:对于表中的每一行,在导入到另一个oracle中后,rowid会保持不变吗?
我猜答案是否定的,但我不知道如何生成rowid。
答案 0 :(得分:3)
否,行ID几乎肯定会更改。即使在同一数据库中,from the docs:
例如,如果使用“导入和导出”实用程序删除并重新插入一行,则其行ID可能会更改。
行ID代表该行在表空间中数据块内,数据块内的位置。 (该文档对此进行了更多说明。)即使目标数据库具有相同的表空间和数据文件,导入也将尽可能有效地将数据加载到文件和块中,并且不会尝试保留旧的行ID。无论如何都不知道,因为它们不属于导出数据。即使可以尝试,这也将涉及将每一行写入磁盘上的特定位置,这会大大降低速度,并且目标DB中的现有数据可能已经在使用相同的行ID。
ROWID
是一个伪列,不是实际行的一部分,因此将其包含在导出的数据中将毫无意义。
尽管您可以在查询的SELECT和WHERE子句中使用ROWID伪列,但这些伪列值实际上并未存储在数据库中。
它甚至不一定是唯一的。
此外,您实际上不应该直接使用它,除非可能在单个查询/语句(here is one use)或过程中使用,因为如果Oracle决定需要重组,它们甚至可以在现有数据库中更改。东西。这就是为什么文档还说:
您不应将ROWID用作表的主键。