客户原来的多个系统功能比较分散,所以做了个新系统,将功能整合起来了。因为原来的系统已经运行了一段时间,所以有原来数据导入的问题。
在原数据库中有两个表,称为A表和B表吧,以一个比较通俗的例子来说明下两个表的关系:A表中保存了某本书的相关信息,比如书名啊,作者啊等等,B表保存了同一个书名下不同书目的具体信息。比如说,A表中的一条记录代表了一本书,如果这本书在现实中有两本,则在B表中就会有两条记录,通过外键与A表关联起来。
现在要将这两个表中的数据导入到新系统中,可问题是数据不能完全一模一样的导入。在B表中有一列属性值是条码号,用来帖在每本书上的。现在客户对条码号的生成规则进行了重新要求,所以在导入数据的时候就不能将数据原样导入了。
在新系统中对应的表姑且称之为AA表和BB表吧,现在的问题是数据导入新系统时,我从原系统的A表取得了一条记录,然后从B表中取得了与之相关联的几条记录,导入到新系统时,数据插入AA表后,我有什么办法得到刚插入的这条记录的主键的值?这个主键值是必须的,因为在接下来的BB表插入中,这个值是作为外键存在的。
请各位大侠指点一下,谢谢了

解决方案 »

  1.   

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

  2.   

    可以用存储过程实现,
    1 用循环先倒入A表的一条记录a,
    2 然后去利用 记录a的主键去B表中查询。取得B的记录,
    3 倒入B
    4 取下一条记录
      

  3.   

    是不是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临时储存新的主键值
      

  4.   

    或者在aa表中新建个字段储存旧的主键值?bb表导入时根据这个字段找到新值
    导完后将这个临时字段drop掉要不就通过一个存储过程用游标对a表进行循环遍历,分别对aa表和bb表进行插入
    就像2楼说的那样
      

  5.   


    你是用什么方式导入呀。是打算自己写sql来导入么,如果是这样的话,Oracle是不支持自增长主键的,所以不存在这里你插入了值,却拿不到主键的情况。Oracle里用sequence来做类似自增长主键的功能。 你可以用currval取当前值,用nextval取新增长的值。
      

  6.   

    回复:
    1,是不是a表的记录导入到aa表后主键的值发生变化? 
    是,主键肯定会变。
    2,是打算自己写sql来导入么?
    是,不光是SQL,还要在程序中做处理,因为其中一列的值要重新设计。
    看了大家的回复,有点头绪了,尤其是狂浪在三楼和四楼给出的方案,基本上就是解决方案了,谢谢大家,结贴了。