我使用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个需要导入的表,这将花费太长时间。
有没有办法解决这个问题,还是有人有任何想法?
由于
答案 0 :(得分:2)
由于您希望C_PLUS
拥有每个表,因此可以省略TABLES
子句。只需指定FROMUSER
即可。您也可以省略TOUSER
参数,因为您没有更改架构名称,但这不会影响导入的行为。省略TABLES
子句应该解决约束问题,假设所有外键约束引用同一模式中的其他表并假设导出文件中的数据允许启用约束(如果导出没有设置CONSISTENT=Y
,转储文件中可能存在孤立的行,这些行将阻止例如创建约束。)
答案 1 :(得分: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';