数据库-序列

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';

以上是关于数据库-序列的主要内容,如果未能解决你的问题,请参考以下文章

如何合理使用数据库锁

重读APUE(11)-信号安全的可重入函数

3星|《财经》2017年第25期:发生客户资料泄露,只惩罚个人不惩罚企业是不合理的

发生 gpload 控制文件处理错误。条目必须是 YAML 序列

从 numpy 数组中删除错误但合理的值

用数据预测未来--时间序列