工作中遇到一个问题。两个数据库之间导数据。只是sequence不同。解决办法如下:
1:首先通过一下命令DISABLE掉所有约束
select 'alter table '||c.table_name||' disable constraint '||c.constraint_name||';' from user_constraints c where c.constraint_type='R';
生成的语句是把约束禁用了.
alter table MANAGER_RROLE disable constraint FK_MRROLE_RROLE;
alter table MANAGER_RROLE disable constraint FK_M_MRROLE;
alter table MANALOG disable constraint FK_MLOG_LT;
alter table RROLE_RRIGHT disable constraint FK_RRIGHT_RR;
。。。。。
然后运行这些SQL将约束禁用
2:分清楚表类型:
第一类:没有主外键关系-----直接导入。
第二类:没有外键,但是表的主键是其他表的外键-------导入时添加临时字段TEMP,用来记录原来表的ID。
第三类:有外键。其主键不是其他表的外键。--------直接导入,后期再更新
第四类:既引用别的表,又别别的表引用。(比如多对多关系表) ------直接导入,后面再更新
2:把目标数据库中第二类表添加一个TEMP字段,记录原始库中的ID
alter table 目标表T add column TEMP integer ;
3:把原始数据库中的表导出成如下sql.
Insert into T(ID,TYPENAME,PARENTID,ORDERNO,FTLEVEL) values (77,'肉类',0,3,1);
.........
4:然后通过sqlplus将所有的以上的SQL都变成如下形式
Insert into T (FTID,TEMP,TYPENAME,PARENTID,ORDERNO,FTLEVEL) values (se_hpdb.nextval,77,'肉类',0,3,1); (se_hpdb.nextval是目标数据库的sequence)
.........
5:然后在目标数据库中执行4中变换了形式的SQL,执行完了之后。通过一下的存储过程来完成最后的更新。
(更新和这个表有关系的表B,B是第三类或者第四类表)
declare
cursor woson_c_tc is
select id,temp from T;
begin
for cur in woson_c_tc loop
update B set id=cur.id where eid=cur.temp;
end loop;
end;
6:恢复约束
alter table MANAGER_RROLE enable constraint FK_MRROLE_RROLE;
alter table MANAGER_RROLE enable constraint FK_M_MRROLE;
alter table MANALOG enable constraint FK_MLOG_LT;
alter table RROLE_RRIGHT enable constraint FK_RRIGHT_RR;
。。。。。
7:删除临时字段TEMP
阅读(2216) | 评论(0) | 转发(0) |