Oracle imp表由于约束而失败



我正在使用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子句。只需指定FROMUSER。您还可以省略TOUSER参数,因为您没有更改模式名称,但这不会影响导入的行为。省略TABLES子句应该解决约束的问题,假设所有外键约束引用同一模式中的其他表,并假设导出文件中的数据允许启用约束(如果导出没有设置CONSISTENT=Y,则转储文件中可能存在孤立行,例如,这些行将阻止创建约束)。

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

禁用约束

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';

启用FK约束

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

相关内容

  • 没有找到相关文章

最新更新