序列SEQUENCE

序列是Oracle 提供的用于生成一系列唯一数字的数据库对象。序列会自动生成顺序递增的序列号,以实现自动提供唯一的主键值。序列可以在多用户并发环境中使用,并且可以为所有用户生成不重复的顺序数字,而不需要任何额外的I/O 开销。

创建序列

序列与视图一样,并不占用实际的存储空间,只是在数据字典中保存它的定义信息。用户在自己的模式中创建序列时,必须具有CREATE SEQUENCE 系统权限;如果要在其他模式中创建序列,必须具有CREATE SEQUENCE 系统权限。

使用 CREATE SEQUENCE 语句创建序列的语法如下:

create sequence <seq_name>
[start with n]
[increment by n]
[minvalue n | nomainvalue]
[maxvalue n | nomaxvalue]
[cache n | nocycle]
[cycle | nocycle]
[order | noorder];
 seq_name:创建的序列名。
 increment:该子句是可选的,表示序列的增量。一个正数将生成一个递增的序列,一个负数将生成一个递减的序列。默认值是1。
 minvalue:可选的子句,决定序列生成的最小值。
 maxvalue:可选的子句,决定序列生成的最大值。
 start:可选的子句,指定序列的开始位置。默认情况下,递增序列的起始值为minvalue,递减序列的起始值为maxvalue。
 cache:可选的子句,决定是否产生序列号预分配,并存储在内存中。
 cycle:可选的子句,当序列达到最大值或者最小值时,可以复位并继续下去。如果达到极限,生成的下一个数据将分别是最小值或者最大值。如果使用nocycle,那么在序列达到其最大值或最小值之后,如果视图再获取下一个值将返回一个错误。

 order:可选的子句,可以保证生成的序列值是按照顺序产生的。例如,order 可以保证第一个请求得到的数为1,第二个请求得到的数为2,以此类推;而noorder 只保证序列值的唯一性,不保证产生序列值的顺序。

建立序列时,必须为序列提供相应的名称。对于序列的其他子句,因为这些子句都具有默认值,所以既可以指定,也可以不指定.

使用序列时,需要用到序列的两个伪列 NEXTVAL 与CURRVAL。其中NEXTVAL 将返回序列生成的下一个序列号,而伪序列CURRVAL 则会返回序列的当前序列号。需要注意的是,首次引用序列时,必须使用伪列NEXTVAL.

实际上,在为表生成主键值时,通常是为表创建一个行级触发器,然后在触发器主体中使用序列值替换用户提供的值。

管理序列

使用 ALTER SEQUENCE 语句可以对序列进行修改。需要注意的是,除了序列的起始值STARTWITH 不能被修改外,其他可以设置序列的任何子句和参数都可以被修改。如果要修改序列的起始值,则必须先删除序列,然后重建该序列.对序列进行修改后,缓存中的序列值将全部丢失。通过查询数据字典USER_SEQUENCES 可以获得序列的信息,下面来看一下USER_SEQUENCES 数据字典都包含哪些序列信息。

当序列不再需要时,数据库用户可以执行DROP SEQUENCE 语句删除序列,来看下面的例子。
【案例】使用 DROP SEQUENCE 语句删除empno_seq 序列,代码及运行结果如下。
SQL> drop sequence empno_seq;
序列已删除

猜你喜欢

转载自blog.csdn.net/qq_38410825/article/details/80695791
今日推荐