linklin1995
_linklin
采纳率100%
2016-05-09 10:00 阅读 3.3k

oracle关于序列的nextval取值

5

创建序列
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');
图片说明

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • 已采纳
    qq_30408111 二三三 2016-05-09 13:37

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

    点赞 评论 复制链接分享
  • Visual0522 visual2015 2016-05-09 12:11

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

    点赞 评论 复制链接分享
  • sxwws sxwws 2016-05-10 02:01

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

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

    点赞 评论 复制链接分享

相关推荐