Oracle数据库中序列(SEQUENCE)的⽤法详解
在Oracle数据库中,序列的⽤途是⽣成表的主键值,可以在插⼊语句中引⽤,也可以通过查询检查当前值,或使序列增⾄下⼀个值。本⽂我们主要介绍了序列的⽤法,希望能够对您有所帮助。
在Oracle数据库中,什么是序列呢?它的⽤途是什么?序列(SEQUENCE)其实是序列号⽣成器,可以为表中的⾏⾃动⽣成序列号,产⽣⼀组等间隔的数值(类型为数字)。其主要的⽤途是⽣成表的主键值,可以在插⼊语句中引⽤,也可以通过查询检查当前值,或使序列增⾄下⼀个值。
创建序列需要CREATE SEQUENCE系统权限。
序列的创建语法如下:
CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [] [{CACHE n|NOCACHE}];
INCREMENT BY ⽤于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表序列的值是按照此步长递减的。
START WITH 定义序列的初始值(即产⽣的第⼀个值),默认为1。
MAXVALUE 定义序列⽣成器能产⽣的最⼤值。选项NOMAXVALUE是默认选项,代表没有最⼤值定义,这时对于递增序列,系统能够产⽣的最⼤值是10的27次⽅;对于递减序列,最⼤值是-1。
MINVALUE定义序列⽣成器能产⽣的最⼩值。选项NOMAXVALUE是默认选项,代表没有最⼩值定义,这时对于递减序列,系统能够产⽣的最⼩值是?10的26次⽅;对于递增序列,最⼩值是1。
CYCLE和NOCYCLE 表⽰当序列⽣成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最⼤值时,循环到最⼩值;对于递减序列达到最⼩值时,循环到最⼤值。如果不循环,达到限制值后,继续产⽣新值就会发⽣错误。
CACHE(缓冲)定义存放序列的内存块的⼤⼩,默认为20。NOCACHE表⽰不对序列进⾏内存缓冲。对序列进⾏内存缓冲,可以改善序列的性能。
删除序列的语法是:
DROP SEQUENCE 序列名;
其中:
删除序列的⼈应该是序列的创建者或拥有DROP ANY SEQUENCE系统权限的⽤户。序列⼀旦删除就不能被引⽤了。
序列的某些部分也可以在使⽤中进⾏修改,但不能修改SATRT WITH选项。对序列的修改只影响随后产⽣的序号,已经产⽣的序号不变。
修改序列的语法如下:
ALTER SEQUENCE 序列名
  [INCREMENT BY n]
  [{MAXVALUE/ MINVALUE n|NOMAXVALUE}]
  [{CYCLE|NOCYCLE}]
  [{CACHE n|NOCACHE}];
*不能修改序列的初始值
创建和删除序列
例1:创建序列:
CREATE SEQUENCE ABC INCREMENT BY 1 START WITH 10 MAXVALUE 9999999 NOCYCLE NOCACHE;
执⾏结果:
序列已创建。
步骤2:删除序列:
DROP SEQUENCE ABC;
执⾏结果:
序列已丢弃。
说明:以上创建的序列名为ABC,是递增序列,增量为1,初始值为10。该序列不循环,不使⽤内存。没有定义最⼩值,默认最⼩值为1,最⼤值为9 999 999。
序列的使⽤
如果已经创建了序列,怎样才能引⽤序列呢?⽅法是使⽤CURRVAL和NEXTVAL来引⽤序列的值。
在编号的过程中,产⽣间隙的原因多种多样。如果⼀个存储过程从⼀个序列中挑选某个数字,定为本地变量,但是从来不⽤它,这个数字就丢失了。它将不能再返回到原序列中,结果就造成数值序列中存在⼀个间隙。关系型数据库模型中不必担⼼这⼀点。但是有时候⼈们在意这⼀点,这些⼈想知道是哪些数字丢失了。
调⽤NEXTVAL将⽣成序列中的下⼀个序列号,调⽤时要指出序列名,即⽤以下⽅式调⽤:
序列名.NEXTVAL
CURRVAL⽤于产⽣序列的当前值,⽆论调⽤多少次都不会产⽣序列的下⼀个值。如果序列还没有通过调⽤NEXTVAL产⽣过序列的下⼀个值,先引⽤CURRVAL没有意义。调⽤CURRVAL的⽅法同上,要指出序列名,即⽤以下⽅式调⽤:
序列名.CURRVAL
产⽣序列的值。
步骤1:产⽣序列的第⼀个值:
SELECT ABC.NEXTVAL FROM DUAL;
执⾏结果:
NEXTVAL —————— 10
步骤2:产⽣序列的下⼀个值:oracle数据库怎么查询表
SELECT ABC.NEXTVAL FROM DUAL;
执⾏结果:
NEXTVAL ——————- 11
产⽣序列的当前值:
SELECT ABC.CURRVAL FROM DUAL;
执⾏结果:
CURRVAL ——————– 11
说明:第⼀次调⽤NEXTVAL产⽣序列的初始值,根据定义知道初始值为10。第⼆次调⽤产⽣11,因为
序列的步长为1。调⽤CURRVAL,显⽰当前值11,不产⽣新值。Oracle的解析函数为检查间隙提供了⼀种要快捷得多的⽅法。它们使你在使⽤完整的、⾯向集合的SQL处理的同时,仍然能够看到下⼀个⾏(LEAD)或者前⼀⾏(LAG)的数值。