问题是这样的,有一个数据库,oracle,结构是这样的:
表1:
一个主键,ID,系统自动生成的,自增。还有一大堆东西,比如userName
表2:
ID,外部关键字,也就是表1的ID,还有一大堆东西,比如Fun 。
现在遇到一个问题(JAVA):
先将一条记录添加到表1中,这时候是没有ID的,然后取得ID,存入表2
但是我把数据存入表1以后,发觉很难找到那个ID,因为表的结构允许除了ID不同外别的一切都可以一直,于是我无法得到这个我添加的记录的ID。
现在的问题是:我该怎么样取得这个ID呢?(请记住,是在网络环境下)
很急的问题,在线等待,万望高手帮忙。

解决方案 »

  1.   

    oracle 是没有自动增长的id的(我用的oracle8i),你是不是用的触发器实现的?是的话,用select sequance.currval from dual 可以取出刚插的id值
      

  2.   

    不仅仅根据时间啊,还要根据刚才输入的值一起来判断。
    当然如果别人也很可能输入相同的一条记录,可以考虑别的方法。如:把自动增加改掉,取id最大值+1为新的id值。
      

  3.   

    runweok(☆☆越来越堕落☆☆)的方法可以。
    但是ORACLE表锁定的同时好像不能保证SEQUEANCE的同步问题。
    因此,如果有并发的INSERT INTO 操作的话,可能SELECT SEQUENCE.CURRVAL
    不一定是正确的SEQUENCE。
    解决方式是在JAVA中保证含有INSERT INTO YOURTABLE方法的唯一性,
    同时对此方法进行同步操作就可以了。
    还有就是如果你的DB中除了ID不同,其他的字段可以全部相同的话,
    说明你的DB设计可能有问题。
    因为,总是能找到业务的逻辑唯一约束的。
      

  4.   

    同步操作在实际中会极大的降低系统性能,对于访问量不大的系统还是不要用同步操作,很多大系统的实现方法是用一张表维护sequence的当前值,插数据的时候用select sequence_currval from sequencetable where sequence_name ='***' for update来锁定行记录,直到当前操作释放该记录时才能由第二个人访问
      

  5.   

    select sequence_currval from sequencetable where sequence_name ='***' for update能解释得更详细一些吗 ?
    谢谢了啊 .
      

  6.   

    的确,我们的做法(还有别的人做啊)好象是先用触发器取得系统的id
    但是他们好象忙啊不肯说,
    具体怎么做呢?谁能说得更详细些吗--从插入到取得ID!谢谢大家了.
      

  7.   

    Connection conn = Drivermanager.getConnection(“”);
    conn.setAutoCommit(false);
    Statement stmt1=conn.createStatement();
    //A是你要操作的表
    String sql="insert into A(a) values('xxx')";
    stmt.execute(sql);
    Statement stmt2=conn.createStatement();
    //sequencename 是你给id建的sequence名字
    ResultSet rs =stmt2.executeQuery("select sequencenme.currval from dual ");
    if (rs.next())
    {
     return rs.getInt(1);//new id
    }
    conn.commit();
    conn.setAutoCommit(true);
    stmt1.close();
    rs.close();
    stmt2.close();
    conn.close();
    这段代码是我临时写的,肯定不能跑意思希望你能明白。至于另一种方式,比较复杂不是三言两语写得清楚的.
      

  8.   

    谢谢,我能看个大概吧,但是他们的做法是:
    首先:
    select seq_orderform_orderid.nextval from dual
    然后取得ID
    rs.getString(1);然后才是用这个ID运行instert into .....
    可能是因为orderform表的orderid 字段设计成了非空.从两个例子可以看出,dual该就是那个什么sequence的当前值的表吧.
    我的疑问是 dual表是不是每个数据库都会有一个啊?
    它里面都是些什么内容啊?然后象sequenctme.currval 或者 seq_orderform_orderid.nextval 该是触发器是吗?象这样的触发器oracle系统都还有哪些啊?还是数据库的设计者设计的啊?都该怎么样使用啊?
    本来是该自己买书看的,但是现在时间确实太急了,只能希望这里能有人帮我救急了.
    如果那位高手愿意帮我的话,我现在还有1000分左右,全送都不是问题.
    谢谢大家了.
      

  9.   

    我觉着问题关键是表1不好,会允许除主键外完全相同的多条字段,是缺陷。
      类似要用自增的问题我是这样解决的,主键ID非自增,再多设置一个自增字段zizeng。不知是否适合楼主的问题。
      

  10.   

    dual是一个虚表 
    先定义一个SEQUEANCE比如sequenctme seq_orderform_orderid就是了
    sequenctme.currval 取出当前值指针没移动或者 seq_orderform_orderid.nextval 取出下一个值 指针也移动到下一个值