我正在使用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';