2 linklin1995 linklin1995 于 2016.05.09 18:00 提问

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');
图片说明

4个回答

qq_30408111
qq_30408111   2016.05.09 21:37
已采纳

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

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

Oracle 序列
Oracle序列nextval以及currval的区别
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

Visual0522
Visual0522   2016.05.09 20:11

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

linklin1995
linklin1995 首先cache不能为0,然后设置nocache时也是同样的结果!
一年多之前 回复
sxwws
sxwws   2016.05.10 10:01

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

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

linklin1995
linklin1995 感谢你的回复!不管是第一种和第二种情况,序列如果没有首先使用nextval的话,都是不能直接取currval的值的
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!