一.创建序列
序列:用于产生唯一序号的数据库对象,可以为多个数据库用户依次生成不重复的连续整数,通常 使用序列生成自动生成表中的主键值。
在用户自己的模式中创建序列时,必须具有CREATE SEQUENCE系统权限;
在其他用户模式中创建序列时,必须具有CREATE ANY SEQUENCE系统权限;
1、创建序列语句:
CREATE SEQUENCE seq_name [START WITH start] [INCREMENT BY increment] [MINVALUE minvalue|NOMINVALUE] [MAXVALUE maxvalue|NOMAXVALUE] [CACHE cache |NOCACHE] [CYCLE |NOCYCLE]
2、参数说明:
START WITH :用于指定初始值
INCREMENT BY :用于指定序列增量(默认为1)
MINVALUE|NOMINVALUE:可生成的最小序列值,默认为 nominvalue
MAXVALUE|NOMAXVALUE:可生成的最大序列值,默认为 nomaxvalue
CACHE |NOCACHE:指定在内存中可以预分配的序列号个数,默认为20
CYCLE |NOCYCLE:指定在达到序列的最大值或最小值之后是否继续复位重新生成序列号,默认为nocycle
例1:创建一个序列deptno_seq ,其开始值为10,增量为5,内存可预分配10个序列号
实现的语句
CREATE SEQUENCE deptno_seq START WITH 10 INCREMENT BY 5 CACHE 10;
二.使用序列
序列具有 CURRVAL和 NEXTVAL两个伪列。 CURRVAL返回序列的当前值, NEXTVAL在序列中产生新值并返回此值。 CURRVAL和 NEXTVAL都返回 NUMBER类型值。可以通过 sequence name. CURRVAL和 sequence name. NEXTVAL形式来应用序列。
可以在下列语句中使用序列的 NEXTVAL和 CURRVAL伪列:
● SELECT语句的目标列中;
● INSERT语句的子查询的目标列中;
● INSERT语句的 VALUES子句中;
● UPDATE语句的SET子句中。
在下列语句中不允许使用序列的 NEXTVAL和 CURRVAL伪列:
●对视图查询的SELECT目标列中;
●使用了DISTINCT关键字的 SELECT语句中;
● SELECTGROUP语句中使用了 BY、 HAVING或 ORDER BY子句时;
●在 SELECT、 DELETE或 UPDATE语句的子查询中;
●在CREATE TABLE或 ALTER TABLE语句中的默认值表达式中。
产生序列的第一个值:
SELECT test sequence. NEXTVAL FROM DUAL;
产生序列的下一个值:
SELECT test sequence. NEXTVAL FROM DUAL;
产生序列的当前值:
SELECT test sequence. CURRVAL FROM DUAL;
注意第一次调用 NEXTVAL产生序列的初始值,根据定义知道初始值为10;第二次调用产生11,因为序列的步长为1.调用 CURRVAL,显示当前值11,不产生新值。
例2:使用序列deptno_seq
向部门表dept中录入记录,要求列deptno使用序列值。
实现的语句:
INSERT INTO dept VALUES(deptno_seq.nextval,’销售部’)
查询序列deptno_seq的当前值:
select deptno_seq.currval from dual;
三.查询序列
可通过查询数据字典USER_SEQUENCES显示当前用户的所有序列的详细信息。
SQL>SELECT increment_by, cache_size, max_value, last_number FROM user_sequences WHERE sequence_name=‘DEPTNO_SEQ’;
四.修改序列
1、修改序列的语句格式:
ALTER SEQUENCE sequence_name [INCREMENT BY increment] [MINVALUE minvalue|NOMINVALUE] [MAXVALUE maxvalue|NOMAXVALUE] [CACHE cache |NOCACHE] [CYCLE |NOCYCLE]
注意:用户需要有ALTER SEQUENCE权限
注意:序列的初始值不能修改
【示例】修改序列sfudent_Seq的步长为1,缓存值的个数为5
SQL>ALTER SEQUENCE student _seq INCREMENT BY 1 CACHE 5;
五.删除序列
当一个序列不再需要时,可以使用 DROP SEQUENCE语句删除序列。删除序列时,系统将序列的定义从数据字典中删除,对于之前序列的应用没有任何影响。
删除序列的语句格式:
DROP SEQUENCE sequence_name
【示例】删除序列 student_seq
SQL>DROP SEQUENCE student seq;