问题是这样的,有一个数据库,oracle,结构是这样的:
表1:
一个主键,ID,系统自动生成的,自增。还有一大堆东西,比如userName
表2:
ID,外部关键字,也就是表1的ID,还有一大堆东西,比如Fun 。
现在遇到一个问题(JAVA):
先将一条记录添加到表1中,这时候是没有ID的,然后取得ID,存入表2
但是我把数据存入表1以后,发觉很难找到那个ID,因为表的结构允许除了ID不同外别的一切都可以一直,于是我无法得到这个我添加的记录的ID。
现在的问题是:我该怎么样取得这个ID呢?(请记住,是在网络环境下)
很急的问题,在线等待,万望高手帮忙。
表1:
一个主键,ID,系统自动生成的,自增。还有一大堆东西,比如userName
表2:
ID,外部关键字,也就是表1的ID,还有一大堆东西,比如Fun 。
现在遇到一个问题(JAVA):
先将一条记录添加到表1中,这时候是没有ID的,然后取得ID,存入表2
但是我把数据存入表1以后,发觉很难找到那个ID,因为表的结构允许除了ID不同外别的一切都可以一直,于是我无法得到这个我添加的记录的ID。
现在的问题是:我该怎么样取得这个ID呢?(请记住,是在网络环境下)
很急的问题,在线等待,万望高手帮忙。
当然如果别人也很可能输入相同的一条记录,可以考虑别的方法。如:把自动增加改掉,取id最大值+1为新的id值。
但是ORACLE表锁定的同时好像不能保证SEQUEANCE的同步问题。
因此,如果有并发的INSERT INTO 操作的话,可能SELECT SEQUENCE.CURRVAL
不一定是正确的SEQUENCE。
解决方式是在JAVA中保证含有INSERT INTO YOURTABLE方法的唯一性,
同时对此方法进行同步操作就可以了。
还有就是如果你的DB中除了ID不同,其他的字段可以全部相同的话,
说明你的DB设计可能有问题。
因为,总是能找到业务的逻辑唯一约束的。
谢谢了啊 .
但是他们好象忙啊不肯说,
具体怎么做呢?谁能说得更详细些吗--从插入到取得ID!谢谢大家了.
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();
这段代码是我临时写的,肯定不能跑意思希望你能明白。至于另一种方式,比较复杂不是三言两语写得清楚的.
首先:
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分左右,全送都不是问题.
谢谢大家了.
类似要用自增的问题我是这样解决的,主键ID非自增,再多设置一个自增字段zizeng。不知是否适合楼主的问题。
先定义一个SEQUEANCE比如sequenctme seq_orderform_orderid就是了
sequenctme.currval 取出当前值指针没移动或者 seq_orderform_orderid.nextval 取出下一个值 指针也移动到下一个值