导入Oracle数据转储并覆盖现有数据

时间:2014-04-17 22:45:54

标签: sql oracle

我有一个oracle dmp文件,我需要将数据导入表中。 转储中的数据包含新行和少量更新行。 我使用import命令和IGNORE = Y,所以它很好地导入了所有新行。但它不会导入/覆盖现有行(它会显示违反唯一键约束的警告)。 是否有一些选项可以使用新数据导入UPDATE现有行?

2 个答案:

答案 0 :(得分:4)

没有。如果您使用数据泵,那么您可以使用TABLE_EXISTS_ACTION=TRUNCATE选项删除所有现有行并从转储文件中导入所有内容,但是您要更新现有行并保留不在新文件中的任何行 - 即不删除它们(我认为,因为你只提到更新,虽然这不清楚) - 这可能不合适。而且,您的转储文件来自旧的exp工具,而不是expdp,无论如何都是如此,除非您可以重新导出数据。

如果您确实要删除转储中不存在的现有行,则可以在导入之前截断所有受影响的表。但这将是你必须自己完成的一个单独步骤,而不是imp将为你做的事情;并且表格会暂空,因此您必须有停机时间才能完成。

或者,您可以导入新的临时表 - 在不同的模式中,因为imp不支持重命名 - 然后将这些新数据用于merge到真实表中。这可能是破坏性最小的方法。您仍然需要设计和编写所有merge语句。没有内置的方法可以自动执行此操作。

答案 1 :(得分:0)

您可以导入临时表,然后通过加入来记录侦听。

使用impdp选项REMAP_TABLE将现有文件加载到临时表中。

impdp .... REMAP_TABLE=TMP_TABLE_NAME

加载完成后,从临时表中对现有表运行MERGE语句。