数据库-序列
Posted EbowTang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库-序列相关的知识,希望对你有一定的参考价值。
参考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,序列的小结
,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,'高三第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';
以上是关于数据库-序列的主要内容,如果未能解决你的问题,请参考以下文章
3星|《财经》2017年第25期:发生客户资料泄露,只惩罚个人不惩罚企业是不合理的