【问题标题】:Oracle imp tables fail due to restraintsOracle imp 表因限制而失败
【发布时间】:2011-12-09 00:14:30
【问题描述】:

我正在使用 Oracle imp 实用程序将数据导入 Oracle 10g 中的一组空表。当我尝试执行导入时,由于参照完整性约束,其中大部分都失败了。例如。无法将数据导入表 A,因为表 B 中的外键尚不存在。

这是我的导入命令:

imp C_PLUS/<password> rows=y file=db.dmp ignore=y FROMUSER=C_PLUS 
TOUSER=C_PLUS tables=...

我可以在导入时手动检查每个表,当它失败时首先导入丢失的表,但是我有 400 多个表需要导入,而且时间太长了。

有没有办法解决这个问题或者有人有什么想法吗?

谢谢

【问题讨论】:

  • 你有什么样的导出(完整、表空间、模式、对象)?您要进行哪种导入?听起来您正在尝试一次导入一个表 - 对吗?那有必要吗?或者你可以用一个命令导入很多表吗?
  • 我有一个完整的数据库转储文件,我想要的只是特定用户表中的数据。该命令有一个所有表的列表,因此它一次将它们全部导入。但它并没有按照正确的顺序来避免约束问题。
  • 要加载C_PLUS 拥有的所有表吗?还是只加载TABLES 参数指定的表子集?
  • 我想要 C_PLUS 拥有的所有表。

标签: database oracle oracle10g imp


【解决方案1】:

由于您想要C_PLUS 拥有的每个表,您可以省略TABLES 子句。只需指定FROMUSER。您也可以省略 TOUSER 参数,因为您没有更改架构名称,但这不会影响导入的行为。省略 TABLES 子句应该可以解决约束问题,假设所有外键约束都引用同一架构中的其他表,并假设导出文件中的数据允许启用约束(如果导出是在没有设置 @ 987654326@,转储文件中可能存在孤立行,例如会阻止创建约束)。

【讨论】:

    【解决方案2】:

    对于每个表,您可以在导入前禁用主键/外键约束。然后在导入后启用每个主键和外键约束。

    禁用约束

    ALTER TABLE table_name DISABLE PRIMARY KEY CASCADE;
    

    启用约束

    ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
    

    如果表的数量和约束的数量太多而无法手动完成,您可以编写脚本使用数据字典视图生成ALTER TABLE命令。

    禁用 PK/FK 约束

    SELECT 'ALTER TABLE '||table_name||' DISABLE PRIMARY KEY CASCADE' sql_statement
    FROM USER_TABLES;
    

    启用PK约束

    SELECT 'ALTER TABLE '||table_name||' ENABLE CONSTRAINT '||constraint_name sql_statement
    FROM USER_CONSTRAINTS
    where constraint_type ='P';
    

    启用外键约束

    SELECT 'ALTER TABLE '||table_name||' ENABLE CONSTRAINT '||constraint_name sql_statement
    FROM USER_CONSTRAINTS
    where constraint_type ='R';
    

    【讨论】:

      猜你喜欢
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 2017-12-23
      相关资源
      最近更新 更多