Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 甲骨文序列_Database_Oracle - Fatal编程技术网

Database 甲骨文序列

Database 甲骨文序列,database,oracle,Database,Oracle,我使用一个序列为我生成一个id,但我使用Java应用程序中的序列。比如说,我的最后一个Id是200 如果我使用201作为id而不是执行seq.nextval来添加带有.sql的条目。当我的java应用程序调用seq.nextval时会发生什么?序列是否足够智能,可以检查最大可用数字,或者只返回201?它只返回201,因为序列不知道这些数字的用途 注意:如果指定序列必须为某些会话缓存值,则它可能返回220(有关详细信息,请参阅)序列只提供了一种“选择”自动递增的数字的方法 您将得到201,因为它们

我使用一个序列为我生成一个id,但我使用Java应用程序中的序列。比如说,我的最后一个Id是200


如果我使用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应用程序的下一次调用中返回的内容取决于许多因素:

  • 如果您在集群环境中运行,请选择下一个与之对话的节点。每个节点将预先分配一个序列值池
  • 与您交谈的节点是否已重新启动。如果发生这种情况,序列值池将趋向于“丢失”(即跳过)
  • 序列的阶跃值;及
  • 事务是否在序列上调用了nextval
  • 序列是松散有序的,而不是绝对有序的


    但是Oracle不知道如何处理序列值,因此如果在数据库中插入201,序列将愉快地返回201,而完全忽略插入的值,因为这两个值基本上是不相关的。

    将序列生成的值与手动插入相混合从来都不是一个好主意,因为这样所有内容都会混淆


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

    记住,除非您首先调用nextval,否则该currval将引发错误。