数据导入问题,麻烦大家看看

bmj 2009-10-13 05:26:12
客户原来的多个系统功能比较分散,所以做了个新系统,将功能整合起来了。因为原来的系统已经运行了一段时间,所以有原来数据导入的问题。
在原数据库中有两个表,称为A表和B表吧,以一个比较通俗的例子来说明下两个表的关系:A表中保存了某本书的相关信息,比如书名啊,作者啊等等,B表保存了同一个书名下不同书目的具体信息。比如说,A表中的一条记录代表了一本书,如果这本书在现实中有两本,则在B表中就会有两条记录,通过外键与A表关联起来。
现在要将这两个表中的数据导入到新系统中,可问题是数据不能完全一模一样的导入。在B表中有一列属性值是条码号,用来帖在每本书上的。现在客户对条码号的生成规则进行了重新要求,所以在导入数据的时候就不能将数据原样导入了。
在新系统中对应的表姑且称之为AA表和BB表吧,现在的问题是数据导入新系统时,我从原系统的A表取得了一条记录,然后从B表中取得了与之相关联的几条记录,导入到新系统时,数据插入AA表后,我有什么办法得到刚插入的这条记录的主键的值?这个主键值是必须的,因为在接下来的BB表插入中,这个值是作为外键存在的。
请各位大侠指点一下,谢谢了
...全文
129 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bmj 2009-10-14
  • 打赏
  • 举报
回复
回复:
1,是不是a表的记录导入到aa表后主键的值发生变化?
是,主键肯定会变。
2,是打算自己写sql来导入么?
是,不光是SQL,还要在程序中做处理,因为其中一列的值要重新设计。


看了大家的回复,有点头绪了,尤其是狂浪在三楼和四楼给出的方案,基本上就是解决方案了,谢谢大家,结贴了。。。。
inthirties 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 bmj 的回复:]
客户原来的多个系统功能比较分散,所以做了个新系统,将功能整合起来了。因为原来的系统已经运行了一段时间,所以有原来数据导入的问题。
在原数据库中有两个表,称为A表和B表吧,以一个比较通俗的例子来说明下两个表的关系:A表中保存了某本书的相关信息,比如书名啊,作者啊等等,B表保存了同一个书名下不同书目的具体信息。比如说,A表中的一条记录代表了一本书,如果这本书在现实中有两本,则在B表中就会有两条记录,通过外键与A表关联起来。
现在要将这两个表中的数据导入到新系统中,可问题是数据不能完全一模一样的导入。在B表中有一列属性值是条码号,用来帖在每本书上的。现在客户对条码号的生成规则进行了重新要求,所以在导入数据的时候就不能将数据原样导入了。
在新系统中对应的表姑且称之为AA表和BB表吧,现在的问题是数据导入新系统时,我从原系统的A表取得了一条记录,然后从B表中取得了与之相关联的几条记录,导入到新系统时,数据插入AA表后,我有什么办法得到刚插入的这条记录的主键的值?这个主键值是必须的,因为在接下来的BB表插入中,这个值是作为外键存在的。
请各位大侠指点一下,谢谢了
[/Quote]

你是用什么方式导入呀。

是打算自己写sql来导入么,

如果是这样的话,Oracle是不支持自增长主键的,所以不存在这里你插入了值,却拿不到主键的情况。

Oracle里用sequence来做类似自增长主键的功能。 你可以用currval取当前值,用nextval取新增长的值。
小灰狼W 2009-10-13
  • 打赏
  • 举报
回复
或者在aa表中新建个字段储存旧的主键值?bb表导入时根据这个字段找到新值
导完后将这个临时字段drop掉

要不就通过一个存储过程用游标对a表进行循环遍历,分别对aa表和bb表进行插入
就像2楼说的那样
小灰狼W 2009-10-13
  • 打赏
  • 举报
回复
是不是a表的记录导入到aa表后主键的值发生变化?
可以对aa表写个行级before触发器,当往aa中插入数据时,先根据:new.主键找到b表中对应的记录,插入到bb表中,大致这样:

create or replace trigger trgname
before insert on aa
for each row
declare
v_seq number;
begin
v_seq := seqname.nextval;
insert into bb
select ...v_seq,... from b where 外键=:new.主键;
:new.主键:=v_seq;
end trgname;

先根据原来的主键值找到对应的b表中的值,然后用新值进行插入
v_seq临时储存新的主键值
jiaruimin11 2009-10-13
  • 打赏
  • 举报
回复
可以用存储过程实现,
1 用循环先倒入A表的一条记录a,
2 然后去利用 记录a的主键去B表中查询。取得B的记录,
3 倒入B
4 取下一条记录


gisyellow 2009-10-13
  • 打赏
  • 举报
回复
你知道主键字段是什么的话,直接取插入的这条记录该字段的值就可以了。。
如果不知道主键是什么,可以利用DataTable的属性PrimaryKey获取(.NET)。。
其他语言我也不知道。。

17,078

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧