Database 甲骨文序列
我使用一个序列为我生成一个id,但我使用Java应用程序中的序列。比如说,我的最后一个Id是200Database 甲骨文序列,database,oracle,Database,Oracle,我使用一个序列为我生成一个id,但我使用Java应用程序中的序列。比如说,我的最后一个Id是200 如果我使用201作为id而不是执行seq.nextval来添加带有.sql的条目。当我的java应用程序调用seq.nextval时会发生什么?序列是否足够智能,可以检查最大可用数字,或者只返回201?它只返回201,因为序列不知道这些数字的用途 注意:如果指定序列必须为某些会话缓存值,则它可能返回220(有关详细信息,请参阅)序列只提供了一种“选择”自动递增的数字的方法 您将得到201,因为它们
如果我使用201作为id而不是执行seq.nextval来添加带有.sql的条目。当我的java应用程序调用seq.nextval时会发生什么?序列是否足够智能,可以检查最大可用数字,或者只返回201?它只返回201,因为序列不知道这些数字的用途
注意:如果指定序列必须为某些会话缓存值,则它可能返回220(有关详细信息,请参阅)序列只提供了一种“选择”自动递增的数字的方法 您将得到201,因为它们不检查任何内容,只存储检索到的最后一个值,当您再次查询它时,它将返回序列中的下一个值。它将返回201 您还可以从JDBC使用nextval,然后使用该值进行插入:
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select seq.nextval from dual");
rs.next();
int yourId = rs.getInt(1);
// then use yourId to do the insert
通过这种方式,您可以使用一个数字进行插入,并且还可以保持其应有的顺序。nextval在Java应用程序的下一次调用中返回的内容取决于许多因素:
但是Oracle不知道如何处理序列值,因此如果在数据库中插入201,序列将愉快地返回201,而完全忽略插入的值,因为这两个值基本上是不相关的。将序列生成的值与手动插入相混合从来都不是一个好主意,因为这样所有内容都会混淆
不确定它在您的情况下是否有帮助,但请记住,您可以请求序列的当前值(使用seq.currval或类似值),这样您就可以检查由于手动插入而在表中是否已经存在,如果需要,请请求另一个nextval记住,除非您首先调用nextval,否则该currval将引发错误。