oracle关于序列的nextval取值

创建序列
create sequence a
increament by 1
start with 1
maxvalue 100
nocycle
cache 10;
如果往空表中直接插入数据,取a.nextval为id的话,查询结果id会从2开始!如果不是从空表插入数据就会从1开始!这是什么原因??请指教图片说明
例如:
create table stu(
id number,
name varchar2(10)
);
直接往里面插入数据:insert into stu values(a.nextval,'link');
id会从2开始(注意这是从空表中插入了数据)
图片说明
要是原来的表中插入了一条数据,id则从1开始的。(在这之前,我把表和序列都重建了)
insert into stu values(12,'d');
insert into stu values(a.nextval,'link');
图片说明

0

3个回答

nextval这个函数是序列里去下一个值的,你设置的从1开始,如果你用了nextval,生成的就是下一个产生的值,如果你设置值的间距是1的话,你用完就产生的是2,如果不用就产生当前的值,就是1

0
linklin1995
_linklin 你没有看懂我的意思!我设置的是从1开始的,增量也为1!当给一个表插入数据时(ID从序列中取),如果是空表会从id从2开始,有数据的表在插入数据是从ID是从1开始的
大约 3 年之前 回复

当sequence的cache为0时,每次sequence.nextval得到的值是当前sequence的值加1。
但cache不为0时,比如为20,他就意味着每次在缓存中去20次再写入数据库去,这样的的用sequence.nextval得到的值就比较难确定,但能保证每次去的值不一样,是递增的。

0
linklin1995
_linklin 首先cache不能为0,然后设置nocache时也是同样的结果!
大约 3 年之前 回复

我理解你在第二种情况下,如果直接用CURRVAL去做insert,应该是会报错的。因为nextval还没有出来,如果是这样,是符合预期的。

在你第一种情况下,你也可以直接用CURRVAL去做insert,看看是不是会报错,如果不报错,则代表CURRVAL当前是有值的,则再去查看原因。

0
linklin1995
_linklin 感谢你的回复!不管是第一种和第二种情况,序列如果没有首先使用nextval的话,都是不能直接取currval的值的
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Oracle序列nextval以及currval的区别
先说一下序列怎么调用 比如创建了序列table_sequence,插入数据时  insert table 表名 列名1,列名2,...... values(table_sequence.nextval,值1,值2,......); insert table 表名 列名1,列名2,...... values(table_sequence.currval,值1,值2,......); 在说下
oracle序列的两个参数:nextval和currval简介
oracle序列的两个参数:nextval和currval 我将通过下面的一个实例来体现两个参数的区别 创建个序列: 注:在调用currval的值前,必须先调用nextval的值,否则会报错,如下图中所示: 从上图中我们可以看到,在多次调用时nextval的值会继续增加 在上图中我们可以看到currval的值在会话中多次调用时,还是和自身会话的当前值一样
oracle中的CURRVAL和NEXTVAL用法(sequence是序列号生成器)
1.什么是sequence?其作用是什么? 在Oracle数据库中,什么是序列呢?其中的作用是什么呢?其实sequence是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。其主要的用途是生成表的主键值,可以在插入语句中引用,在插入之前,获取序列号nextval值,然后进行插入。也可以通过查询检查当前值,或使序列增至下一个值。 2.如何定义一个sequen
MyBatis中获取Oracle序列
一、应用情景:      当应用系统中使用了mybatis,并且首先需要获取序列的下一个值来完成某些功能操作,之后再进行数据的添加操作。二、代码:<select id="findMaxId" parameterType="pd" resultType="java.lang.Integer" useCache="false" flushCache="true" > se
序列问题导致主键冲突
序列问题 create sequence BOSDATA.GET_PK_SEQ minvalue 1 maxvalue 999999999999999999999999999 start with 1001630254 increment by 1 cache 2000 cycle; select 'EAR' || to_char(sysdate,'YYYYMMDD')
oracle 不一样的获取nextval 方式
create or replace function get_seq_next (seq_name in varchar2) return number is   seq_val number ; begin   execute immediate 'select '|| seq_name|| '.nextval from dual' into seq_val ;   return se
insert语句中sequence的使用方法
我们常常在表中需要插入一些自动增长的值;一方面,我们可以手动添加这些值,另一方面,oracle提供的sequence可以帮助我们实现插入的值自动增长,而不需要我们手动的提供值,我们需要做的就是设置好sequence的初值和增长值即可。关于序列的定义和参数设置,请参考:http://blog.csdn.net/BOBO12082119/archive/2011/01/08/6124597.aspx下面是一个实例:create table goods( goods_id varchar2(5)
序列初始化过了,但每次currval都要先nextval,为何?
序列已经初始化过了,但每次要得到seq.currval都要先nextval,为何?我定义了一个序列,从1开始计数的,已经运行过select ...nextval from dual了。CREATE SEQUENCE seq_v4u;select seq_v4u.nextval from dual;但是我发现每个session要使用currval之前还是要求输入一个select nextval.....
跳过nextval查询当前序列值
原文地址——http://blog.csdn.net/qq525099302/article/details/47280211 user_sequences中保存着当前用户的所有序列信息,可以从这张系统内置表中查询当前序列值select seq.last_number from user_sequences seq where seq.sequence_name='SEQ_B_ORDER_ID';
数据库序列 nextval
1.什么是sequence?其作用是什么? 在Oracle数据库中,什么是序列呢?其中的作用是什么呢?其实sequence是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。其主要的用途是生成表的主键值,可以在插入语句中引用,在插入之前,获取序列号nextval值,然后进行插入。也可以通过查询检查当前值,或使序列增至下一个值。 2.如何定义一个sequence...
Oracle生成不重复票号 LPAD() 、RPAD() 函数 与 NEXTVAL() 函数概述
SELECT TO_CHAR(SYSDATE,'YYMMDD')||LPAD(REFUNDSEQ.NEXTVAL,6,'0') AS RES_ORDER_NO FROM DUAL 该语句拼接 时间 与 LPAD产生的 'REFUNDSEQ.NEXTVAL值的前6位有字符,如果不足6位,就用0补足' ,为防止出现重复票号增加时间 ,一天最多出现999999个有效票号 DUAL : 是oracle的虚拟表,不是真实存在的,又称ORCLE伪表,方便输出结果集 REFUNDSEQ : 这个是开发人员自己起的一个"序
oracle 此处不允许有序号
这个错误原因主要是因为:根据官方资料,oracle限制nextval出现在以下方式:我犯的错误应该是第三条(一个select语句中) Restrictions on Sequence Values You cannot use CURRVAL and NEXTVAL in the following constructs: ■ A subquery in a DELETE, SELECT, o
db2和oracle查询序列区别
DB2中:nextval for sequencename ,prevval for sequencename select nextval for seq_name from sysibm.sysdummy1; select prevval for seq_name from sysibm.sysdummy1; oracle中:sequencename.nextval,sequence
ORACLE序列NEXTVAL的使用范围
Restrictions on Sequence Values You cannot use CURRVAL and NEXTVAL in the following constructs: ■ A subquery in a DELETE, SELECT, or UPDATE statement ■ A query of a view or of a materialized view ...
Oracle含有序列的事务回滚,序列值不能回到执行事务前的状态
CREATE SEQUENCE lhz_seq; //Sequence LHZ_SEQ 已创建 SELECT lhz_seq.NEXTVAL FROM dual // 输出:1 SELECT lhz_seq.CURRVAL FROM dual // 输出:1 INSERT INTO users(id,username,password ) VALUES(lhz_seq.NEXT...
Oracle序列(sequence)创建失败,无法取值(.nextval),无法删除(drop)解决办法
Oracle序列(sequence)创建失败,无法取值(.nextval),无法删除(drop)解决办法出错过程:(一)我用oracle帐户TRACQDEV下利用myEclipse数据库工具中创建了一个序列:CREATE SEQUENCE "TRACQDEV"."seq_agent_money_log_id" MINVALUE 1 MAXVALUE 1.00000000000000E+
mybatis 事务中多次去oracle中获取sequence,返回相同值的问题
问题:当在事务中多次获取oracle的sequence,会返回相同的值。是因为其每次都会去取一级缓存中的值。解决方法:1.拿出@Transactional,就不会出错。2.加上useCache="false" flushCache="true",不保存在二级缓存中,并清空缓存3.mybatis.configuration.localCacheScope=STATEMENT,修改一级缓存的作用域4....
sequence跳号问题以及相应知识拓展
SEQUENCE跳号可能是事务ROLLBAK或者实例被宕过或者是SEQUENCE的CACHE被交换出去过。第一个或者第二个解决方法比较难解决(可以从业务上来避免)。第三个对于有特殊要求的SEQUENCE或者包、存储过程、触发器等等,可以使用DBMS_SHARED_POOL.KEEP方法,把他们永久保留在SHARED POOL中,从而可以实现一些特定的用途。用SEQUENCE值来生成的主键经常出现断...
oracle 一次获取序号多个值的写法
SELECT seq_loc_num_id.nextval  FROM DUAL CONNECT BY LEVEL<=10;
mybatis插入oracle的序列号
使用oracle的序列号 先查询出下一个序列号,且会自动注入到参数中的指定属性上(本例中的id属性), 插入完成后, controller中的user对象的id属性也有值了 SELECT seq_changez_user.nextval id from dual insert into temp_changez_user (id, username) value
oracle 序列批量插入
不用触发器和存储过程,只需要变换一下,加个子sql   insert into t1(id,name) select PK_SEQ.NEXTVAL,t.* from ( select 'name1' from dual union all select 'name2' from dual ) t       ...
hibernate 与oracle在id自增长sequence的思考与总结
可能遇到的问题 Hibernate: select hibernate_sequence.nextval from dual Caused by: java.sql.SQLException: ORA-02289: 序列(号)不存在”Caused by: java.lang.IllegalArgumentException: argument type mismatchCaused by: j
ibatis的insert中使用序列
Oracle中创建序列 create sequence MYDB_SEQUENCE increment by 1 start with 1 nomaxvalue minvalue 1;   xml写法     SELECT  MYDB_SEQUENCE.NEXTVAL FROM DUAL       insert into Student(id,name,age)
Oracle修改sequence的初始值
懒人修改方式: 第一步:X = (select  你的sequence的全名.nextval from dual;  ); 第二步:Y = 你要设定的值;  Z = Y - X; 第三步:alter sequence 你的sequence的全名 increment by Z ; 提示:序列已修改。(注意,这不是最后一步!) 最后一步:select 你的sequence的全名.cur
分析oracle的sequence序列的跳号现象
从做Jforum项目以来,遇到一个很明显的现象,就是每个表的主键都出现跳号现象。具体表现在:当一次操作若干条数据时,自动增长的sequence序列总是从200的倍数开始增加,这次操作完成后,无论这时currentval是什么,隔段时间,总是又从下一个200的倍数开始了。比如说:一张表当前value是800,增加了3条记录,这时currentval应该是803。但是隔段时间以后,再次插入数据时,就从
mybatis取Oracle序列,值相同问题处理
&amp;lt;select id=&quot;getCode&quot; resultType=&quot;java.lang.String&quot;&amp;gt; select 'TRD'||to_char(sysdate,'yyyymmdd')||lpad(to_char(SQ_ORD_PURCHASE_ID.nextval), 5, '0') code from dual &amp;lt;/select&amp;gt; 上述mybatis代码...
Oracle sequence 重置(失效恢复)
在Oracle数据库移植过程中,sequence可能失效,本资源可使失效的sequence重新恢复作用
关于hibernate在处理oracle序列的时候遇到的一些问题分析
现象与该文类似:http://www.cnblogs.com/fangwenyu/archive/2011/08/01/2123929.html   上文的解释没有问题 DBSequence*allocationSize&amp;lt;= IDs &amp;lt; (DBSequence+1)*allocationSize 只有当id到达下个序列值*allocationSize时,序列值才会自增1。 ...
Oracle 数据库 序列 序列是否可以重复
<br /> <br />序列是Oracle数据库对象,利用它可以生成唯一的整数,一般利用它生成主键值。<br />序列的创建语法如下:<br />CREATE SEQUENCE 序列名  <br />[INCREMENT BY n] <br />[START WITH n] <br />[{MAXVALUE/ MINVALUE n|NOMAXVALUE}] <br />[{CYCLE|NOCYCLE}] <br />[{CACHE n|NOCACHE}];<br />INCREMENT BY 用于定义序列
Mybatis之nextval函数生成流水号,行级锁实现线程安全的nextval()方法
mysql中实现类似oracle中的nextval函数 我们知道mysql中是不支持sequence的,一般是建表的时间使这个字段自增。 如 create table table_name(id int auto_increment primary key, ...); 或者alter table table_ame add id int auto_...
sequence跳号问题及解决办法
装载自:点击打开链接一、    问题及现象描述--创建序列CREATE SEQUENCE NYYTEST.S_TEST    STARTWITH 1    INCREMENTBY 1   NOMINVALUE    MAXVALUE10000   NOCYCLE   CACHE  20   NOORDERSQL&amp;gt; select S_TEST.nextval from dual;   NEXT...
求助:Oracle序列重置的问题
 创建了一个序列,作为一个表的主键。每次用nextval插入值,序列会自动增加,但是删除表中数据后,接着插入数据,序列还会在原由的基础上继续递增请问怎样可以将此序列重置为初始值?
mysql实现nextVal功能
首先创建表: CREATE TABLE `sys_sequence` ( `NAME` varchar(50) NOT NULL, `CURRENT_VALUE` int(11) NOT NULL DEFAULT '0', `INCREMENT` int(11) NOT NULL DEFAULT '1', PRIMARY KEY (`NAME`) ) 插入记录 IN
笔记:mybatis-oracle使用序列自增
先建立序列   seq_xxxx_detail在mybatis中使用&amp;lt;insert id=&quot;xxxx&quot; parameterType=&quot;map&quot;&amp;gt; &amp;lt;selectKey resultType=&quot;int&quot;  keyProperty=&quot;id&quot; order=&quot;BEFORE&quot;&amp;gt;   SELECT  seq_xxxx_detail.nextval FROM DU
oracle动态创建自动增长的序列
1.动态创建自动增长的序列: declarev_sql varchar2(1000);v_num number(20):=1;beginv_sql:='create sequence sqbs ';select max(sqb.id)+1 into v_num from sqb;if v_num is null then v_num :=1;v_sql:=v_sql||' maxvalue 9...
oracle 数据导出导入序列不一致问题
1.ORACLE数据库在导入导出时序列不一致的问题   在使用ORACLE数据库时,当给一个表设置自增字段时,我们经常会使用到序列+触发器来完成。但当你需要对数据库进行导入导出时,序列很容易出问题。 当你将数据库导出后,导入到另一个数据时,你会发现另一个数据库里的序列当前值会小于之前数据库的当前值,由此会导致你往该表插入数据时,会出现自增字 段的值重复的情况,如果这个自增字段为主键,则你的
Oracle中序列的操作以及使用前对序列的初始化
一 创建序列 create sequence myseq start with 1 increment by 1 nomaxvalue minvalue 1   二 初始化序列   select myseq.nextval from dual; 这里值得注意的是,如果先直接写select myseq.currval from dual,会提示会提示myseq.currtval尚
mybatis 批量插入使用序列以及批量更新(Oracle数据库)
insert into MOBILE_RECIPIENT(ID, MOBILE_DETAIL_ID, MOBILE, ERROR, STATUS, CREATE_TIME,CONTENT)  select SEQUENCE_MOBILE_RECIPIENT_ID.NEXTVAL ,A.* from (         select            #{item.mobileDeta
oracle日期和sequence生成随机ID
insert into mydata.user(id,username) values ( to_char(sysdate,'yyyymmddHH24mmss') || lpad(mydata.seq_user.nextval,12,'0') , '测试用户')  
Oracle使用序列和触发器实现自增ID
需求:         向表中插入记录时,使得某列能够自动插入ID,并且插入的ID是自增的。        我们可以先创建一个序列,例如 GOODS_GOODS_ID,然后每次使用如下SQL语句即可完成该功能, insert into Goods(GoodsID, name) values ( GOODS_GOODS_ID.nextval, '农夫烤鸡'); 若我们希望如下方式的SQL操作
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 关于大数据培训 关于云计算