参考ORACLE总结,但测试参考KES和ORACLE
1、创建序列:
CREATE SEQUENCE SEQUENCE_NAME INCREMENT BY n START WITH n MAXVALUE n | NOMAXVALUE MINVALUE n | NOMINVALUE CYCLE | NOCYCLE CACHE n | NOCACHE | ORDER;
INCREMENT BY n 序列增加幅度 START WITH n 序列开始值 MAXVALUE n 序列最大值 MINVALUE n 序列最小值 CYCLE 回收序列号 CACHE n 默认20个序列号缓存数NOORDER模式。 CACHE n ORDER 在RAC中共用一个SEQUENCE的CACHE,NOORDER不共用CACHE。
user_sequences, all_sequences, dba_sequences
SELECT * FROM USER_SEQUENCES WHERE SEQUENCE_NAME = 'SEQUENCE_NAME';
2、序列管理:
可修改的值:增加、最大、最小、回收、缓存。 无法修改的值:开始值。(oracle限制,KES没有) 修改开始值必须删除重建。
ALTER SEQUENCE SEQUENCE_NAME INCREMENT BY n MAXVALUE n MINVALUE n CYCLE CACHE n;
删除和授权:
DROP SEQUENCE sequence_name; GRANT SELECT ON sequence_name TO user_name; GRANT ALTER ANY SEQUENCE;
3.序列的使用:
NEXTVAL 下一个序号 CURRVAL 当前的序号
例:
SELECT sequence_name.nextval FROM dual; SELECT sequence_name.currval FROM dual;
回滚后,序列不能回滚,序列号不连续。
4、Cache设置注意事项:
NOCACHE序列跳号不会造成,但并发性能差会造成row cache lock等待事件。 在RAC环境中SEQUENCE CACHE适量设置较大,避免序列竞争,如每秒数万次SELECT, 并发量很大cache需要设置在100甚至1000以上。
不同cache模式等待事件: NOCACHE --> row cache lock CAHCE NOORDER --> enq: SQ-contention(SQ lock) CACHE ORDER(RAC) --> DFS look handle(SV lock)
五、序列总结
,5.1 思维导图
5.2测试代码
在KES通过测试,在ORACLE验证了一些代码(也应该通过)
------------------------------------- ----序列的测试 ------------------------------------- --最大值10的序列 -- Create sequence drop sequence if exists SEQ_TEST;--删除序列 create sequence SEQ_TEST maxvalue 9999 minvalue 1000 start with 1000 increment by 2 cache 20 nocycle; --dual是Oracle中的?个伪表,利利利这个伪表可以设置或查看序列, --或者是调??一些内置函数,可以吗?便的时候。 --序列调用 产生一个新的序列,然后执行一个值 select SEQ_TEST.nextval from dual --查看当前序列的值,重复执行的数字不会改变 select SEQ_TEST.currval from dual --从这个SEQ_TEST在序列中选择下一个数字: SELECT nextval('SEQ_TEST'); --------------------------------- -----------查看序列视图信息--------- --------------------------------- --查看序列视图 select * from user_sequences; select * from all_sequences; select * from dba_sequences; ---通过序列视图查看指定信息 select min_value,max_value,increment_by,last_number,cycle_flag from dba_sequences where sequence_name = 'SEQ_TEST'; --创建实验表 drop TABLE if exists student;--删除序列 CREATE TABLE student ( stu_nmb number(8), stu_name char(8) not null, gender varchar2(2), age number(2), --检查约束 class varchar2 (40) not null, email varchar2 (30), sdate DATE, ---执行约束 constraint pk_nmb primary key (stu_nmb), constraint ck_check check ( gender in (男,女), constraint ck_age check (age BETWEEN 18 AND 30), --检查约束 constraint uq_student_email UNIQUE (email) ); --用于生成主键序列 INSERT INTO student VALUES(nextval('SEQ_TEST张德田,男,19,高三第六班,28@qq.com',SYSDATE); INSERT INTO student VALUES(nextval('SEQ_TEST,吴海峰,男,高三第一班@qq.com',SYSDATE); INSERT INTO student VALUES(nextval('SEQ_TEST'),男,20,高三第八班@qq.com',SYSDATE); INSERT INTO student VALUES(nextval('SEQ_TEST宋义,女,20,高三第三班@qq.com',SYSDATE); INSERT INTO student VALUES(nextval('SEQ_TEST,张华乐,女,高三第四班@qq.com',SYSDATE); INSERT INTO student VALUES(nextval('SEQ_TEST'),黎文,女,高三第四班@qq.com',SYSDATE); INSERT INTO student VALUES(nextval('SEQ_TEST吉祥,男,高三第七班,22@qq.com',SYSDATE); INSERT INTO student VALUES(nextval('SEQ_TEST向玲,女,19,高三第一班@qq.com',SYSDATE); INSERT INTO student VALUES(nextval('SEQ_TEST'),梅田田@qq.com',SYSDATE); select stu_nmb,stu_name from student; --结果 stu_nmb stu_name 1014 张德田 1018 吴海峰 1020 章德正 1022 宋义 1024 张华乐 1026 黎文 1028 吉祥 1030 向玲 1032 梅田田 ----修改视图 --修改原视图的下列属性 --请注意合理性,以下修改是不合理的,因为start with 1000 alter sequence seq_test minvalue 2000 maxvalue 8000 incremet by 2
cycle
--对于oracle而言,下列也是不合理的---不支持直接变更起始值
--oracle报错ORA-02283: 无法变更启动序列号
alter sequence seq_test
minvalue 1000
start with 3100
maxvalue 7000
increment by 5
cycle ;
------
--不合理,因为起始值是3100
alter sequence seq_test
minvalue 1000
maxvalue 3000
increment by 5
cycle ;
-----
--1.更改increment为一个你想让序列增加到的值
alter sequence seq_xxrs increment by 1000;
--2.执行一次查询序列的语句
select seq_xxrs.nextval from dual;
--3.然后将increment改回来
alter sequence seq_xxrs increment by 1;
--此时的序列的起始值值就增大了。
---通过序列视图查看指定的信息
select min_value,max_value,increment_by,cycle_flag,start_value
from all_sequences
where sequence_name = 'SEQ_TEST';