Import ORACLE 10g:如何在没有外键约束错误的情况下导入?

Import ORACLE 10g:如何在没有外键约束错误的情况下导入?,import,oracle10g,Import,Oracle10g,我有一个数据转储,然后我想将其导入另一个DB(Oracle 10g)。目标数据库已经有表(无数据)和一些外键约束。为了避免约束错误,我将按表导入数据。如果有人知道更简单的方法,请教我?。(Oracle的导入工具没有自动识别表之间关系的功能,是吗?假设您有架构级别的导出,源架构具有相同的外键约束,并且所有外键约束都位于同一架构中的表之间,导入实用程序应自动处理外键约束。您不需要为此做任何事情(当然,在导入时您必须忽略错误,因为它将尝试创建表并获取它们已经存在的错误)。假设您有架构级别的导出,则源架

我有一个数据转储,然后我想将其导入另一个DB(Oracle 10g)。目标数据库已经有表(无数据)和一些外键约束。为了避免约束错误,我将按表导入数据。如果有人知道更简单的方法,请教我?。(Oracle的导入工具没有自动识别表之间关系的功能,是吗?

假设您有架构级别的导出,源架构具有相同的外键约束,并且所有外键约束都位于同一架构中的表之间,导入实用程序应自动处理外键约束。您不需要为此做任何事情(当然,在导入时您必须忽略错误,因为它将尝试创建表并获取它们已经存在的错误)。

假设您有架构级别的导出,则源架构具有相同的外键约束,并且所有外键约束都位于同一架构中的表之间,导入实用程序应该自动处理外键约束。您不需要为此做任何事情(当然,在执行导入时,您必须忽略错误,因为它将尝试创建表并获取它们已经存在的错误)。

您可以先禁用所有外键:

begin
  for cnst in (SELECT constraint_name, table_name FROM user_constraints WHERE constraint_type ='R') loop
    execute immediate 'alter table '|| cnst.table_name||' disable constraint ' || cnst.constraint_name ;
  end loop;
end;
加载数据后,执行相同的操作以重新启用它们(只需将alter table命令更改为
enable
,而不是
disable


但这是有风险的,因为如果数据不符合您的限制,您将遇到问题…

您可以先禁用所有外键:

begin
  for cnst in (SELECT constraint_name, table_name FROM user_constraints WHERE constraint_type ='R') loop
    execute immediate 'alter table '|| cnst.table_name||' disable constraint ' || cnst.constraint_name ;
  end loop;
end;
加载数据后,执行相同的操作以重新启用它们(只需将alter table命令更改为
enable
,而不是
disable


但这是有风险的,因为如果数据不符合您的约束条件,您将遇到问题…

如果(出于某种原因)您不想使用@JustinCave解决方案,您可以循环用户约束表并首先禁用外键约束。然后,在导入数据后再次启用它们。但如果我是您,我不会这样做…如果(出于某种原因)如果你不想使用@JustinCave解决方案,你可以先在user_constraints表上循环并禁用外键约束。然后,在导入数据后再次启用它们。但如果我是你,我就不会这样做……在类似于11g XE的asker的情况下,我使用
imp ignore=Y tuser=foo
对一个预先存在的模式,它是cFK约束上的hokes。它按字母顺序处理表格,我根本看不到它会自动处理FK?它似乎是在最后启用它们,但如果它们预先存在,则没有帮助。在类似于asker使用11g XE的情况下,我使用
imp ignore=Y tuser=foo
对一个预先存在的模式进行处理,并且它是chokes在FK约束上。它按字母顺序处理表格,我根本看不到它会自动处理FK?它似乎在最后启用它们,但如果它们预先存在,那就没用了。