一、序列定义:
序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。不占用磁盘空间,占用内存。
其主要用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值。
我们都知道,开发过程中有时候需要数据库中的主键是数字类型并且自增,mysql、sql server中都可以使用工具创建表的时候实现,但是oracle中没有设置自增的方法,一般情况我们会使用序列和触发器来实现主键自增的功能。
(触发器详解:https://blog.csdn.net/Java_15707951907/article/details/90230575)
二、序列的创建:
CREATE SEQUENCE sequence //创建序列名称
[INCREMENT BY n] //递增的序列值是 n 如果 n 是正数就递增,如果是负数就递减 默认是 1
[START WITH n] //开始的值,递增默认是 minvalue 递减是 maxvalue
[{MAXVALUE n | NOMAXVALUE}] //序列可生成的最大值
[{MINVALUE n | NOMINVALUE}] //序列可生成的最小值
[{CYCLE | NOCYCLE}] //用于定义当序列产生的值达到限制值后是否循环(CYCLE:循环,NOCYCLE:不循环)
[{CACHE n | NOCACHE}];//表示缓存序列的个数,数据库异常终止可能会导致序列中断不连续的情况,默认值为20,如果不使用缓存可设置NOCACHE
举例:
create sequence my_seq
increment by 1
start with 1
nomaxvalue
nocycle
cache 20;
三、序列的使用:
序列创建后,可以使用序列的NEXTVAL来获取序列的下一个值,使用CURRVAL来查看当前值。第一次使用必须先使用NEXTVAL来产生一个值后才可以使用CURRVAL进行查看。
//序列调用 产生一个新的序列
select my_seq.nextval from dual
//查看当前序列的值
select my_seq.currval from dual
//向表中插入数据时使用
insert into 表名 (id) values (序列名.nextval)
修改和删除:
使用 alter 命令进行修改
使用 drop 命令删除
四:序列约束条件:
1、序列第一次必须先调用nextval获取一个序列值才能使用currval查看当前值
2、序列的起始值不能小于最小值
3、创建一个循环序列,则必须要设定最大值
4、如果创建带缓存的序列,缓存的值必须满足约束公式: 最大值-最小值>=(缓存值-1)*每次循环的值