Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3583588
  • 博文数量: 109
  • 博客积分: 10011
  • 博客等级: 上将
  • 技术积分: 2457
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-18 19:04
文章分类

全部博文(109)

文章存档

2011年(1)

2010年(10)

2009年(36)

2008年(62)

我的朋友

分类: Oracle

2008-09-02 20:00:21

工作中遇到一个问题。两个数据库之间导数据。只是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
 
 
 
 
阅读(2181) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~