Oracle序列

时间:2009-05-10 15:34:09

标签: database oracle

我正在使用Sequence为我生成一个id,但是我在Java应用程序中使用了该序列。所以说例如我的最后一个ID是200.

如果我使用201作为id而不是使用seq.nextval来添加带.sql的条目。当我的java应用程序调用seq.nextval时会发生什么?序列是否足够聪明,可以检查最大可用数量,还是只返回201?

5 个答案:

答案 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取决于许多因素:

  1. 如果您在群集环境中运行,则接下来与哪个节点通信。每个节点都将预先分配一个序列值池;
  2. 您正在与之交谈的节点是否已重新启动。如果发生这种情况,序列值池将倾向于“丢失”(意味着跳过);
  3. 序列的步长值;和
  4. 交易是否在序列上调用了nextval。
  5. 序列松散排序,而不是绝对有序。

    但是Oracle不知道你对序列值做了什么,所以如果你在数据库中插入一个201,序列将很高兴地返回201完全忘记插入的值,因为这两者基本上是无关的。

答案 4 :(得分:0)

将序列生成的值与手动插入混合起来永远不是一个好主意,因为一切都会混淆。

不确定它是否对您的情况有帮助,但请记住,您可以要求序列的当前值(使用seq.currval或类似),以便您可以检查表中是否已存在由于手动插入和,如有必要,请求另一个nextval