Oracle 原理:序列

 序列是生成唯一的连续序号的对象。有点像SQLServer里面的种子标识,可以用来实现自增。

CREATE SEQUENCE S_NO    --序列名
START WITH 1            --起始值
INCREMENT BY 1          --自增值
MAXVALUE  200           --最大值
MINVALUE 1              --最小值
NOCYCLE                 --超过最大值是否从头算起
CACHE 10;               --内存中预先分配的序列号

创建序列需要权限 CREATE SEQUENCE;

CACHE 10 :指的是预先分配的序列号。比如当用户要取序列 1 时,1~10就会一起生成好,这样下次取序列2时,就不用先进行计算了,直接取序列2就行。

CREATE SEQUENCE S_NO2    --序列名
START WITH 1            --起始值
INCREMENT BY 1 ;         --自增值

select * from user_sequences

查看自身用户创建的的序列信息可以用user_sequences ;  查看所有用户的序列信息可以用 dba_sequences

我们可以看见,各个值的默认值,当没有指明值的时候,MIN_VALUE默认是1,MAX_VALUE是10^28,不进行循环,CACHE_SIZE为20;

使用SEQUENCE 时, CURRVAL 获取当前序列;NEXTVAL 获取下一个序列;首次使用SEQUENCE时要使用NEXTVAL对序列进行初始化,否则会报错。

此时再查询序列 s_no 信息:

发现 LAST_NUMBER 变成了11,因为你的CACHE_SIZE设成了10

不断获取下一个序列,发现在此过程中,S_NO的LAST_NUMBER 一直是11.

当获取到11时,LAST_NUMBER才变到21。

利用序列实现SQLServer里边的种子字段的自增功能,只要insert into 的时候用 s_no.nextval 就行了;

例如,学号通常是由 入学年份和专业代码还有班级座位号组成的,班级座位号的自动生成就可以使用序列;

 

修改序列:除了START WITH 起始值不能修改,其他都可以被修改

ALTER SEQUENCE S_NO 
Maxvalue 1000 
Cycle  
INCREMENT BY -6;

可以用CREATE OR REPLECE 重建,或者设置 INCREMENT BY 为 负值,执行以下NEXTVAL也行。

 

   if 序列没被初始化

     LAST_NUMBER =  Nextval

   else 

     LAST_NUMBER =  下一个进行内存分配的序列号

 

删除序列:

DROP SEQUENCE [序列名]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章