oracle的sequence的next number值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle的sequence的next number值相关的知识,希望对你有一定的参考价值。
使用:
CREATE SEQUENCE test_sequence1
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10;
建立sequence后,在plsql中看到序列的定义时有一个是NEXT NUMBER,此时是1,但当使用了一次这个sequence后,再看这个NEXT NUMBER就是11了,我理解不应该是下一个值,即2么?难道理解不对?谢谢!
the next number is 11是从PLSQL DEVELOPER的SEQUENCE用右键VIEW到的。
但是我没有中断数据库连接或是其它操作,cache也会跳号?
NEXTNUMBER是序列下一次要缓存的值的起始。即,与cache缓存后面的数字有关,如果cache10,则下一次nextnumber就是11
NEXTVAL是序列取出下一个值,每取出一次,累计一次
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10;
测试代码如下:
select seq_user.nextnumber from dual; --返回11
select seq_user.nextval from dual; --返回1
select seq_user.nextval from dual; --返回2 参考技术A 是你指定了cache的缘故。如果指定cache值,oracle就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组 到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort)或者其他导致内存丢失的情况,cache中的sequence就会丢失,再取sequence的值的时候就会跳过。你这个也是跳过了中间的10个数字直接到11了。防止出现这样的情况可以在建sequence时指明“nocache”。本回答被提问者和网友采纳 参考技术B 是的,你的sequence步长为1。
you can issue the command :select sequence_name.next_value from dual; to determine the next value of this sequence.
and you mean the next number is 11, what's the mean? where did you see that? 参考技术C 执行 select test_sequence1.currval from dual;
可以看到当前序列。
在PL/SQL里面看到的那个是指定了cache的缘故
回答者: ljc86211 已经说的很清楚了!
Sequence在Oracle中的使用
Oracle中,当需要建立一个自增字段时,需要用到sequence。sequence也可以在mysql中使用,但是有些差别,日后再补充,先把oracle中sequence的基本使用总结一下,方便日后查阅。
1、创建sequence:
- create sequence SEQ_ON_USER
- minvalue 1
- maxvalue 999999999999999999999999999
- start with 1
- increment by 1
- nocache;
说明:
minvalue:序列最小值
maxvalue/nomaxvalue:序列最大值/没有最大值
start with 1:序列从1开始
increment by 1:每次增加1
cache/nocache:nocache不缓存。cache缓存。开启缓存,效率高,只是如果数据库宕机了,缓存丢失,会出现序列跳号情况。
2、查看已有sequence:
- select * from user_sequences;
3、删除指定sequence:
- DROP SEQUENCE SEQ_ON_USER;
4、查看指定sequence的当前值:
两种方式:
- select last_number from user_sequences wheresequence_name=‘SEQ_ON_USER‘;
- select SEQ_ON_USER.nextval from sys.dual;
5、创建触发器使用sequence设置主键自动插入。
- create or replace trigger "SEQ_ON_USER_GENERATOR" before
- insert on databasename1.T_USER for each row
- declare
- mid number,
- begin
- select SEQ_ON_USER.nextval into mid from dual;
- :new.id:=mid;
- end
- create trigger SEQ_ON_USER_Trigger
- before insert on T_USER for each row
- begin
- select SEQ_ON_USER.nextval into :new.id from dual;
- end SEQ_ON_USER_Trigger;
6、代码中使用sequence.nextval插入主键值。
以上是关于oracle的sequence的next number值的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 11.2.0.4.0 Dataguard部署和日常维护-Datauard 主备切换和故障转移篇
LeetCode31 Next Permutation and LeetCode60 Permutation Sequence