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是序列取出下一个值,每取出一次,累计一次

CREATE SEQUENCE seq_user
INCREMENT BY 1 -- 每次加几个 
START WITH 1 -- 从1开始计数 
NOMAXVALUE -- 不设置最大值 
NOCYCLE -- 一直累加,不循环 
CACHE 10;

测试代码如下:

select seq_user.nextnumber from dual;  --返回1
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

 

[sql] view plain copy
 
  1. create sequence SEQ_ON_USER  
  2. minvalue 1  
  3. maxvalue 999999999999999999999999999  
  4. start with 1  
  5. increment by 1  
  6. nocache;    

 

说明:

 minvalue:序列最小值

 maxvalue/nomaxvalue:序列最大值/没有最大值

 start with 1:序列从1开始

 increment by 1:每次增加1

 cache/nocache:nocache不缓存。cache缓存。开启缓存,效率高,只是如果数据库宕机了,缓存丢失,会出现序列跳号情况。

 

2、查看已有sequence

 

[sql] view plain copy
 
  1. select * from user_sequences;  

3、删除指定sequence

 

[sql] view plain copy
 
  1. DROP SEQUENCE SEQ_ON_USER;  

4、查看指定sequence的当前值:

两种方式:

 

[sql] view plain copy
 
  1. select last_number from user_sequences wheresequence_name=‘SEQ_ON_USER‘;  

 

 

[sql] view plain copy
 
  1. select SEQ_ON_USER.nextval from sys.dual;  

        5、创建触发器使用sequence设置主键自动插入。

 

[sql] view plain copy
 
  1. create or replace trigger "SEQ_ON_USER_GENERATOR" before  
  2.   insert on databasename1.T_USER for each row  
  3.   declare  
  4.          mid number,  
  5.   begin  
  6.     select SEQ_ON_USER.nextval into mid from dual;  
  7.     :new.id:=mid;  
  8.    end  
  9.   
  10. create trigger SEQ_ON_USER_Trigger   
  11.   
  12. before insert on T_USER for each row   
  13. begin   
  14. select SEQ_ON_USER.nextval into :new.id from dual;   
  15. end SEQ_ON_USER_Trigger;   

 

        6、代码中使用sequence.nextval插入主键值。

 

以上是关于oracle的sequence的next number值的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 11.2.0.4.0 Dataguard部署和日常维护-Datauard 主备切换和故障转移篇

通过增量备份恢复来处理Oracle DG 复制GAP

oracle中的sequence

LeetCode31 Next Permutation and LeetCode60 Permutation Sequence

Sequence在Oracle中的使用

Sequence在Oracle中的使用