一. 关于序列
序列是一个Oracle对象,提供唯一的数字,在需要时根据指定的增量值来递增,通常是用于产生主键值。类似于SQL server中的identity(int,1,1) 或者列为identity列。SQL server可以直接将列指定为IDENTITY列,在使用的时候可以不需要理会IDENTITY列,系统会自动递增,这样看来SQL Server中主键的产生更为方便。
1.序列的特性
自动提供唯一的数值
共享对象
主要用于提供主键值
代替应用代码
将序列值装入内存可以提高访问效率
2.如何create sequence语句定义序列
前提:Prerequisites
To create a sequence inyour own schema, you must have the CREATE
SEQUENCE
system privilege. 在自己模式下创建序列需要create sequence权限
To create a sequence inanother user's schema, you must have the CREATE
ANY
SEQUENCE
system privilege. 在其他用户模式下创建序列需要create any sequence权限。
CREATE SEQUENCE sequencename
[INCREMENT BY n] 定义序列增长步长,省略为1
[START WITH m] 序列起始值,省略为1
[{MAXVALUE n | NOMAXVALUE}] 序列最大值,NOMAXVALUE升序时,序列最大值的次方
降序时为-(默认也是为此)
[{MINVALUE n | NOMINVALUE}] 序列最小值,NOMINVALUE升序时,最小值为,降序时序列
最小值为-的次方(默认也是为此)
[{CYCLE | NOCYCLE}] 到达最大值或最小值后,继续产生序列(默认NOCYCLE)
[{CACHE n | NOCACHE}]; 序列缓存与否(默认NOCACHE)
--创建一个序列
SQL> CREATE SEQUENCE my_seq
2 INCREMENT BY 10
3 START WITH 100
4 MAXVALUE 150
5 NOCACHE
6 NOCYCLE;
Sequence created.
3.使用序列
NEXTVAL 和CURRVAL 伪列
NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用
CURRVAL 中存放序列的当前值
第一次使用时CURRVAL不能用
使用时需要指定序列的对象名
将序列值装入内存可提高访问效率
序列在下列情况下出现裂缝:
–回滚
–系统异常
–多个表同时使用同一序列
如果不将序列的值装入内存(NOCACHE), 可使用表USER_SEQUENCES 查看序列当前的有效值
--当第一次使用序列时指定了currval列,结果出现如下错误提示
SQL> SELECT my_seq.currval FROM dual;
SELECT my_seq.currval FROM dual
*
ERROR at line 1:
ORA-08002: sequence MY_SEQ.CURRVAL is not yet defined in this session
--使用nextval列,则成功执行,这就是NEXTVAL 必须在CURRVAL 之前指定,及第一次使用必须是NEXTVAL
SQL> SELECT my_seq.nextval FROM dual;
NEXTVAL
----------
100
SQL> SELECT my_seq.currval FROM dual;
CURRVAL
----------
100
SQL> create sequence student_test_seq start with 1 NOCACHE; Sequence created. SQL> select student_test_seq.currval from dual; select student_test_seq.currval from dual * ERROR at line 1: ORA-08002: sequence STUDENT_TEST_SEQ.CURRVAL is not yet defined in this session SQL> select student_test_seq.nextval from dual; NEXTVAL ---------- 1 SQL> select student_test_seq.currval from dual; CURRVAL ---------- 1
4.查询序列
USER_SEQUENCES
DBA_SEQUENCES
ALL_SEQUENCES
查询数据字典视图USER_SEQUENCES获取序列定义信息
如果指定NOCACHE 选项,则列LAST_NUMBER 显示序列中下一个有效的值
SQL> SELECT sequence_name,min_value,max_value
2 increment_by,cycle_flag,order_flag,
3 cache_size,last_number
4 FROM user_sequences
5 WHERE sequence_name IN ('SEQ1','SEQ2','MY_SEQ');
SEQUENCE_NAME MIN_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ------------ - - ---------- -----------
MY_SEQ 1 150 N N 0 110
SEQ1 1 200 Y N 0 110
SEQ2 1 200 Y N 0 31
SQL> SELECT sequence_name,min_value,max_value
2 increment_by,cycle_flag,order_flag,
3 cache_size,last_number
4 FROM user_sequences
5 WHERE sequence_name IN ('SEQ1','SEQ2','MY_SEQ');
SEQUENCE_NAME MIN_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ------------ - - ---------- -----------
MY_SEQ 1 150 N N 0 110
SEQ1 1 200 Y N 0 110
SEQ2 1 200 Y N 0 31
6.修改序列
修改序列的增量, 最大值, 最小值, 循环选项, 或是否装入内存
修改序列的注意事项
必须是序列的拥有者或对序列有ALTER 权限
只有将来的序列值会被改变
改变序列的初始值只能通过删除序列之后重建序列的方法实现
其它的一些限制
SQL> ALTER SEQUENCE my_seq
2 INCREMENT BY 20
3 MAXVALUE 160
4 CYCLE;
Sequence altered
--注意当序列值达到最大值后,其初始值变成了,但增量值不会发生变,如下面的例子
SQL> select sys.my_seq.nextval from dual;
NEXTVAL
----------
130
SQL> /
NEXTVAL
----------
150
SQL> / --此时序列值变成了
NEXTVAL
----------
1
SQL> / --此时序列值按作为增量值,所以结果为
NEXTVAL
----------
21
7.删除序列
使用DROP SEQUENCE 语句删除序列
删除之后,序列不能再次被引用
SQL> alter sequence STUDENT_TEST_SEQ increment by 5 maxvalue 20 cycle; Sequence altered. SQL> select student_test_seq.nextval from dual; NEXTVAL ---------- 6 SQL> select student_test_seq.nextval from dual; NEXTVAL ---------- 11 SQL> select student_test_seq.nextval from dual; NEXTVAL ---------- 16 SQL> select student_test_seq.nextval from dual; NEXTVAL ---------- 1
SQL> drop sequence student_test_seq; Sequence dropped.