在许多的数据库之中都支持一种列类型 – 自动增长列。实际上各个数据库都会提供自动的操作,但是只有Oracle数据库提供的是手工的操作,而这个手工的操作对象就是序列。序列本身依然属于 oracle 的对象,所以想要定义序列,依然需要 DDL 的操作持,序列的创建语法如下:
CREATE SEQUENCE 序列名称
[INCREMENT BY 步长] [START WITH 开始值]
[MAXVALUE 最大值 | NOMMAXVALUE] [MINVALUE 最小值 | NOMINVALUE]
[CYCLE | NOCYCLE] [CACHE 缓冲个数 | NOCACHE];
范例:创建一个序列
DROP SEQUENCE myseq;
CREATE SEQUENCE myseq;
当一个序列创建成功以后,如果想要操作这个序列,那么可以通过两个伪列进行:
· 序列.nextval:取得下一个序列的增长结果,每调用一次此操作,序列值增加;
· 序列.currval:取得当前的序列内容。
当一个序列创建完成以后,实际上是无法立刻使用的,即:是没有当前内容的,所以如果现在世界使用 currval ,那么一定不会有任何的结果返回,必须在执行了 nextval 之后,序列才可以真正的被创建并使用。
范例:每调用一次 nextval 那么序列内容都会增长
SELECT myseq.nextval FROM dual;
范例:每一次调用 currval 都会取得当前的内容,序列不会改变
SELECT myseq.currval FROM dual;
如果想要查询序列的信息,肯定使用的是 user_sequences 数据字典,所以下面需要观察一下这个数据字典的组成。
- SEQUENCE_NAME(序列名称):现在只有一个 myseq 的序列,对象名称就是 myseq;
- MIN_VALUE(最小值):在默认情况下序列是从1开始的,所以最小值就是1;
- MAX_VALUE(最大值):表示序列增长的最大内容;
- INCREMENT BY(步长):默认情况下,每一次增长的步长为1;
- C(CYCLE,循环标记):是否是一个循环的序列,默认是 “N”;
- O(ORFER,排序):在多个数据库共享同一个序列时的排序要求;
- CACHE_SIZE(缓冲大小):表示缓冲20;
LAST_NUMBER(最后的数据):缓冲后的结果。
每当用户每一次取得序列值的时候实际上都是贝缓冲后的结果,如果现在数据库出现了问题,或者实例停止掉,那么可能所有被缓冲的数据就会消失了,就会产生跳号。
清楚了序列的基本的操作之后,那么下面就必须去在表上应用序列,刚才一直强调,序列是一种手工的处理方式,所以在建立数据表的时候与之前是没有任何区别的,关键在于增加数据上。
范例:建立一张表
DROP TABLE mytab PURGE;
CREATE TABLE mytab(
id NUMBER CONSTRAINT pk_id PRIMARY KEY ,
name VARCHAR2(10)
);
范例:手工设置数据
INSERT INTO mytab(id,name) VALUES (myseq.nextval,'MARI');
使用序列,主要的目的是可以生成一种流水号。
但是在序列的创建语法之中,毕竟还有许多其他的选项,下面分别来看各个选项的作用:
1、设置步长:INCREMENT BY 步长
默认情况下每一次的增长内容是1,那么用户也可以自己进行修改。
DROP SEQUENCE myseq;
CREATE SEQUENCE myseq
INCREMENT BY 5;
2、定义序列的开始值: START WITH 开始值
默认的开始值是从1开始,那么也可以由用户自己指定开始数值,例如:做一个电子商务平台,它的开始值就可以大一些。
DROP SEQUENCE myseq ;
CREATE SEQUENCE myseq
INCREMENT BY 5
START WITH 300000 ;
3、定义循环序列:现在希望序列内容可以在 1、3、5、7、9 之间循环出现
- 开始值(START WITH) 为 1 ;
- 步长(INCREMENT BY) 为 2 ;
- 最大值(MAXVALUE) 为 9 ;
- 最小值(MINVALUE) 为 1 ;
- 循环标记(CYCLE) ;
- 缓冲设置(CACHE):设置的内容比 MAXVALUE 小,或者直接取消缓冲。
DROP SEQUENCE myseq ;
CREATE SEQUENCE myseq
INCREMENT BY 2
START WITH 1
MINVALUE 1 MAXVALUE 9
CYCLE NOCACHE ;
如果是在开发之中,对于序列最常用的情况不是上面这些特殊序列操作形式,往往都是一个顺序的流水编号。