
序列
序列可以保证多个用户对同一张表进行操作时生成唯一的整数,利用序列可以自动生成主关键字,序列只存在于数据字典中。
一个简单的例子:
create sequence type_id increment by 1 start with 1;
这行语句中,type_id为序列号的名称,每次增长为1,起始序号为1。
如果要删除序列,用drop sequence 序列名。
生成一个序列:
CREATE SEQUENCE dept_deptid_seq
INCREAMENT BY 10
START WITH 120
MAXVALUE 9999
NOCACHE
NOCYCLE;
#如果是用来生成主键值的话,不要用CYCLE选项,而且命名序列时最好能体现它的潜在用途以便于理解.
确认序列:
SELECT sequence_name,min_value,max_value,increament_by,last_number
FROM user_sequences;
#如果你指定了NOCACHE选项,那么LAST_NUMBER列将显示下一可用的序列号
使用NEXTVAL可以访问序列中的下一个编号,但问题常常出现在会话初始序列之前查询其当前序列号CURRVAL
CREATE SEQUENCE emp_seq
NOMAXVALUE
NOCYCLE;
然后查询
SELECT emp_seq.currval
FROM dual;
将返回错误,问题就在于你视图引用CURRVAL之前,在你的会话中并没有使用NEXTVAL先初始化此序列.
SELECT emp_seq.nextval
FROM dual;
这样再查询CURRVAL就不会出错了.
使用序列:
INSERT INTO departments(department_id,department_name,location_id) VALUES (dept_deptid_seq.NEXTVAL,'Support',2500);
对序列进行缓冲存储可以提高性能,因为这样就不必对每个生成的编号都更新数据字典表,只需要对每一组编号进行更新即可.这样,在我们查询NEXTVAL时就直接从缓冲中提取,速度将快很多,但是进行序列缓冲带来的负面影响就是当数据库被回滚时,比如说系统崩溃,手动ROLLBACK数据时,在缓冲中存储的序列值将会丢失,这也就是为什么会出现空缺(GAPS),如果生成序列时指定的是NOCACHE,那么可以在USER_SEQUENCES表里查询下一个可用的序列号值,这个查询并不会产生增加序列值的动作.
修改序列:
ALTER SEQUENCE dept_deptid_seq
INCREMENT BY 20
MAXVALUE 999999
NOCACHE
NOCYCLE;
规则:
>必须为序列的所有者或者拥有ALTER特权
>修改对于以后的序列号生效
>序列必须是被删除然后重新生成(使所有相关的对象失效,并且失去相应的关联)
>修改时还要满足些其他的验证条件,比如说新的MAXVALUE不可以比现在的序列号低
删除序列:
DROP SEQUENCE dept_deptid_seq;
>必须要是序列的所有者或者有DROP ANY SEQUENCE的权限





