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

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

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

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

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