一、什么是序列?
是数据库对象一种。多个用户可以通过序列生成连续的数字以此来实现主键字段的自动、唯一增长,并且一个序列可为多列、多表同时使用。
二、序列语法:
CREATE SEQUENCE 序列名
START WITH 1000 -- 从1000开始
INCREMENT BY 1 -- 每次加1个
MAXVALUE 20000 -- 设置最大值 (也可以设置无最大值NOMAXVALUE)
NOCYCLE -- 一直累加,不循环,达到最大值就停止
CACHE 10; --设置缓存10个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
具体说明:
INCREMENT BY:指定序列增长步长。可以为正(升序)、负整数(降序),但不能为0。最高精度28。
START WITH: 指定序列起始数。默认为序列最小值。
MAXVALUE :指定序列最大值。最大28位。必须大于等于起始值且大于等于序列最小值。
NOMAXVALUE: 无最大值(实际为10^27或-1)。default
MINVALUE :指定序列最小值。
NOMINVALUE :无最小值(实际为1或-10^26)。Default
CYCLE :指定序列达到最大值或最小值后继续从头开始生成。
NOCYCLE :不循环生成。Default.
CACHE :指定数据库内存中预分配的序列值个数,以便快速获取。最小cache值为2。
Cache参数最大值为:(CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT)
注意1:如果系统发生故障,所有缓存的没有被DML语句使用并提交的序列值将丢失。潜在丢失值数量等于cache的数量。
NOCACHE :不指定缓存数,默认缓存20
ORDER :指定order条件保证序列按请求顺序生成。此条件适用于RAC环境。
NOORDER :不保证序列按请求顺序生成。
三、获得sequence的值
1)CurrVal:sequence的当前值
SELECT 序列名称.currval FROM DUAL;
SELECT 序列名称.nextval FROM DUAL;
在Sql语句中可以使用sequence的地方:
- 不包含子查询、snapshot、VIEW的 SELECT 语句
- INSERT语句的子查询中
- INSERT语句的values中
- UPDATE 的 SET中
如在插入语句中:
insert into table表名(id,name) values(seqtest.nextval,'haa');
注意: 如果创建表直接添加数据不是从1开始,而是从2开始!; 如果表中有数据就会从1开始!??
四、修改序列
拥有ALTER ANY SEQUENCE 权限才能改动sequence. 可以修改但除start with以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再重新创建。
alter sequence 序列名
increment by 10
maxvalue 100000;
此时修改的maxvalue必须大于序列当前值。
五、删除序列
删除序列必须要有drop any sequence权限!
drop sequence 序列名