0

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

这是我的导入命令:

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

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

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

谢谢

4

2 回答 2

2

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

于 2011-12-08T15:58:27.080 回答
0

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

禁用约束

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';
于 2011-12-08T16:04:11.927 回答