目录
序列的创建
序列的使
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
在许多数据库之中都会存在有一种数据类型 — 自动增长列,它能够创建流水号。如果想在 Oracle 中实现这样的自动增长列,可以使用序列的方式完成
序列的创建
create sequence 序列名称
[MAXVALUE 最大值 | NOMAXVALUE]
[MINVALUE 最小值 | NOMINVALUE]
[INCREMENT BY 步长 ] [START WITH 开始值 ]
[CYCLE | NOCYCLE]
[CACHE 缓存个数 | NOCACHE] ;
MAXVALUE :可选项,定义序列的最大值
MINVALUE :可选项,定义序列的最小值
START WITH 开始值:可选项,定义序列的开始值
INCREMENT BY 步长:可选项,定义序列每次增加值
CYCLE :可选项,表示当序列增加到最大值或者减少到最小值的时候,重新从开始值继续
CACHE :可选项,表示是否产生序列号预分配,并存储在内存中
序列属于数据库对象的创建过程,属于 DDL 的分类范畴。对于序列而言,创建之后一定会在数据字典中保存
CREATE SEQUENCE myseq ;
上面代码创建一个序列,名字为 myseq,所有参数都取默认值
既然序列的对象信息会在数据字典中保存,那么现在就可以查询序列的数据字典
SELECT * FROM user_sequences ;
SEQUENCE_NAME :序列名称,本次为 MYSEQ
MIN_VALUE :当前序列的最小值,本次为 1
MAX_VALUE :当前序列的最大值,本次为“1.0000E+28”
INCREMENT_BY :每次序列增长的步长内容
CY :是否为循环序列,本次为“N”
OR :是否需要排序
CACHE_SIZE :缓存个数,默认为 20 个
LAST_NUMBER :最后的数值。现在序列已经创建成功了,如果要想使用序列则可以使用如下的两个伪列完成
nextval :取得序列下一个内容,每一次调用序列的值都会增长
currval :表示取得序列的当前内容,每一次调用序列不会增长,如果要想使用此伪列,那么在使用之前必须首先使用 nextval 取得内容才可以。
只有运行了 nextval 之后才表示内容真正可以使用
序列的使
CREATE TABLE mytab(
id NUMBER ,
name VARCHAR2(50) ,
CONSTRAINT pk_id PRIMARY KEY(id)
) ;
此时的数据表与原始相比没有任何区别,但是在数据增加的时候,由于 id 属于一个主键列,所以可以利用序列来生成 id 的内容
INSERT INTO mytab(id,name) VALUES (myseq.nextval,'HELLO') ;
以上的操作是序列在实际开发中使用最多的一种情况,但是从序列的创建语法来讲,并不是这么简单,所以下面需要对序列进行进一步的分析
那么首先需要来解决缓存的作用是什么
在序列的操作过程中,为了保证序列操作的性能问题,会利用缓存在用户未使用到指定的序列值时自动将内容创建好,这样用户在使用序列中就不是一起创建的了,从而达到性能的提升
但是缓存本身会存在一个丢号的问题,如果数据库关闭了,那么序列的内容就可能无法连续了,称此为丢号问题
但是以上所创建的只是标准的序列,而实际上序列也可以创建一些特殊情况
DROP SEQUENCE myseq ;
CREATE SEQUENCE myseq
INCREMENT BY 2 ;
上面代码中,“DROP SEQUENCE myseq ”表示删除序列的代码,然后创建一个新的序列,步长为 2
DROP SEQUENCE myseq ;
CREATE SEQUENCE myseq
INCREMENT BY 2
START WITH 100000 ;
上面代码中,创建的序列开始值为 100000,增加的步长为 2。
在序列的使用过程中还可以创建一个循环序列,例如希望序列可以在 1、3、5、7、9 之间循环显示,所以此时就需要设置序列的最大值 9、最小值 1,而且设置为循环
DROP SEQUENCE myseq ;
CREATE SEQUENCE myseq
INCREMENT BY 2 START WITH 1
MINVALUE 1 MAXVALUE 9
CYCLE NOCACHE;
从实际情况来说,序列的使用往往都不需要这么复杂,生成一个流水号就够了