我正在使用Sequence为我生成一个id,但是我在Java应用程序中使用了该序列。所以说例如我的最后一个ID是200.
如果我使用201作为id而不是使用seq.nextval来添加带.sql的条目。当我的java应用程序调用seq.nextval时会发生什么?序列是否足够聪明,可以检查最大可用数量,还是只返回201?
答案 0 :(得分:3)
它将返回201,因为序列不知道数字的用途。
注意:如果您指定序列必须缓存某个会话的值,则可能会返回220(有关更多详细信息,请参阅Oracle manual about CREATE SEQUENCE)
答案 1 :(得分:2)
序列只是提供了一种“选择”自动递增的数字的方法。
您将获得201因为他们不检查任何内容,他们只存储检索到的最后一个值,当您再次查询它时,它将返回序列中的下一个值。
答案 2 :(得分:0)
它将返回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
通过这种方式,您可以使用数字插入,并保持序列的顺序。
答案 3 :(得分:0)
来自Java应用程序的下一次调用返回的nextval取决于许多因素:
序列松散排序,而不是绝对有序。
但是Oracle不知道你对序列值做了什么,所以如果你在数据库中插入一个201,序列将很高兴地返回201完全忘记插入的值,因为这两者基本上是无关的。
答案 4 :(得分:0)
将序列生成的值与手动插入混合起来永远不是一个好主意,因为一切都会混淆。
不确定它是否对您的情况有帮助,但请记住,您可以要求序列的当前值(使用seq.currval或类似),以便您可以检查表中是否已存在由于手动插入和,如有必要,请求另一个nextval