参考ORACLE总结,但是测试参考KES和ORACLE
- 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';
可以修改的值:增幅、最大值、最小值、循环使用、缓存。
不能修改的值:开始值。(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;
NEXTVAL 下一个序号
CURRVAL 当前的序号
例:
- SELECT sequence_name.nextval FROM dual;
- SELECT sequence_name.currval FROM dual;
发生回滚后,序列不能回滚,会发生序列号不连续的情况。
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)

在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,'高三第6班','28@qq.com',SYSDATE);
- INSERT INTO student VALUES(nextval('SEQ_TEST'),'吴海峰','男',18,'高三第1班','21@qq.com',SYSDATE);
- INSERT INTO student VALUES(nextval('SEQ_TEST'),'章德正','男',20,'高三第8班','24@qq.com',SYSDATE);
- INSERT INTO student VALUES(nextval('SEQ_TEST'),'宋义','女',20,'高三第3班','98@qq.com',SYSDATE);
- INSERT INTO student VALUES(nextval('SEQ_TEST'),'张华乐','女',19,'高三第4班','12@qq.com',SYSDATE);
- INSERT INTO student VALUES(nextval('SEQ_TEST'),'黎文','女',19,'高三第4班','13@qq.com',SYSDATE);
- INSERT INTO student VALUES(nextval('SEQ_TEST'),'吉祥','男',21,'高三第7班','22@qq.com',SYSDATE);
- INSERT INTO student VALUES(nextval('SEQ_TEST'),'向玲','女',19,'高三第1班','23@qq.com',SYSDATE);
- INSERT INTO student VALUES(nextval('SEQ_TEST'),'梅田田','女',21,'高三第7班','25@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
- increment 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';