当前位置: 技术问答>java相关
超级简单的问题,但是好象很烦人,没有人知道。
来源: 互联网 发布时间:2017-03-22
本文导语: 问题是这样的,有一个数据库,oracle,结构是这样的: 表1: 一个主键,ID,系统自动生成的,自增。还有一大堆东西,比如userName 表2: ID,外部关键字,也就是表1里面的ID,还有一大堆别的东西,比如fun。 现在是...
问题是这样的,有一个数据库,oracle,结构是这样的:
表1:
一个主键,ID,系统自动生成的,自增。还有一大堆东西,比如userName
表2:
ID,外部关键字,也就是表1里面的ID,还有一大堆别的东西,比如fun。
现在是这样的(在JAVA中)
先有一条记录,把它添加到表1中,这时候是没有ID的,然后取得从表1中取得ID,存入表2
现在的问题出来了,ID是表1的唯一有效关键字,所以你一旦把数据写如了表1,就永远不可能取得ID,因为在数据库允许两条记录除了ID不同以外别的内容完全一致。
你根本就无法判断,哪一条记录才是你刚才插入的记录。
我现在的问题是:怎么样取得那条记录的ID?记住,这是在网络环境下的程序设计。
很急,在线等待,希望高手赐教。
表1:
一个主键,ID,系统自动生成的,自增。还有一大堆东西,比如userName
表2:
ID,外部关键字,也就是表1里面的ID,还有一大堆别的东西,比如fun。
现在是这样的(在JAVA中)
先有一条记录,把它添加到表1中,这时候是没有ID的,然后取得从表1中取得ID,存入表2
现在的问题出来了,ID是表1的唯一有效关键字,所以你一旦把数据写如了表1,就永远不可能取得ID,因为在数据库允许两条记录除了ID不同以外别的内容完全一致。
你根本就无法判断,哪一条记录才是你刚才插入的记录。
我现在的问题是:怎么样取得那条记录的ID?记住,这是在网络环境下的程序设计。
很急,在线等待,希望高手赐教。
|
runweok(☆☆越来越堕落☆☆)的方法可以。
但是ORACLE表锁定的同时好像不能保证SEQUEANCE的同步问题。
因此,如果有并发的INSERT INTO 操作的话,可能SELECT SEQUENCE.CURRVAL
不一定是正确的SEQUENCE。
解决方式是在JAVA中保证含有INSERT INTO YOURTABLE方法的唯一性,
同时对此方法进行同步操作就可以了。
还有就是如果你的DB中除了ID不同,其他的字段可以全部相同的话,
说明你的DB设计可能有问题。
因为,总是能找到业务的逻辑唯一约束的。
但是ORACLE表锁定的同时好像不能保证SEQUEANCE的同步问题。
因此,如果有并发的INSERT INTO 操作的话,可能SELECT SEQUENCE.CURRVAL
不一定是正确的SEQUENCE。
解决方式是在JAVA中保证含有INSERT INTO YOURTABLE方法的唯一性,
同时对此方法进行同步操作就可以了。
还有就是如果你的DB中除了ID不同,其他的字段可以全部相同的话,
说明你的DB设计可能有问题。
因为,总是能找到业务的逻辑唯一约束的。
|
dual是一个虚表
先定义一个SEQUEANCE比如sequenctme seq_orderform_orderid就是了
sequenctme.currval 取出当前值指针没移动或者 seq_orderform_orderid.nextval 取出下一个值 指针也移动到下一个值
先定义一个SEQUEANCE比如sequenctme seq_orderform_orderid就是了
sequenctme.currval 取出当前值指针没移动或者 seq_orderform_orderid.nextval 取出下一个值 指针也移动到下一个值
|
oracle 是没有自动增长的id的(我用的oracle8i),你是不是用的触发器实现的?是的话,用select sequance.currval from dual 可以取出刚插的id值
|
不仅仅根据时间啊,还要根据刚才输入的值一起来判断。
当然如果别人也很可能输入相同的一条记录,可以考虑别的方法。如:把自动增加改掉,取id最大值+1为新的id值。
当然如果别人也很可能输入相同的一条记录,可以考虑别的方法。如:把自动增加改掉,取id最大值+1为新的id值。
|
应该可以用存储过程做
|
我觉着问题关键是表1不好,会允许除主键外完全相同的多条字段,是缺陷。
类似要用自增的问题我是这样解决的,主键ID非自增,再多设置一个自增字段zizeng。不知是否适合楼主的问题。
类似要用自增的问题我是这样解决的,主键ID非自增,再多设置一个自增字段zizeng。不知是否适合楼主的问题。
|
加个字段取服务器当前日期和时间,然后找最後加入的就是。