序列是生成唯一的连续序号的对象。有点像SQLServer里面的种子标识,可以用来实现自增。
CREATE SEQUENCE S_NO --序列名
START WITH 1 --起始值
INCREMENT BY 1 --自增值
MAXVALUE 200 --最大值
MINVALUE 1 --最小值
NOCYCLE --超过最大值是否从头算起
CACHE 10; --内存中预先分配的序列号
创建序列需要权限 CREATE SEQUENCE;
CACHE 10 :指的是预先分配的序列号。比如当用户要取序列 1 时,1~10就会一起生成好,这样下次取序列2时,就不用先进行计算了,直接取序列2就行。
CREATE SEQUENCE S_NO2 --序列名
START WITH 1 --起始值
INCREMENT BY 1 ; --自增值
select * from user_sequences
查看自身用户创建的的序列信息可以用user_sequences ; 查看所有用户的序列信息可以用 dba_sequences
我们可以看见,各个值的默认值,当没有指明值的时候,MIN_VALUE默认是1,MAX_VALUE是10^28,不进行循环,CACHE_SIZE为20;
使用SEQUENCE 时, CURRVAL 获取当前序列;NEXTVAL 获取下一个序列;首次使用SEQUENCE时要使用NEXTVAL对序列进行初始化,否则会报错。
此时再查询序列 s_no 信息:
发现 LAST_NUMBER 变成了11,因为你的CACHE_SIZE设成了10
不断获取下一个序列,发现在此过程中,S_NO的LAST_NUMBER 一直是11.
当获取到11时,LAST_NUMBER才变到21。
利用序列实现SQLServer里边的种子字段的自增功能,只要insert into 的时候用 s_no.nextval 就行了;
例如,学号通常是由 入学年份和专业代码还有班级座位号组成的,班级座位号的自动生成就可以使用序列;
修改序列:除了START WITH 起始值不能修改,其他都可以被修改
ALTER SEQUENCE S_NO
Maxvalue 1000
Cycle
INCREMENT BY -6;
可以用CREATE OR REPLECE 重建,或者设置 INCREMENT BY 为 负值,执行以下NEXTVAL也行。
if 序列没被初始化
LAST_NUMBER = Nextval
else
LAST_NUMBER = 下一个进行内存分配的序列号
删除序列:
DROP SEQUENCE [序列名]