一,定义
sequence(序列)是数据库对象一种。多个用户可以通过序列生成连续的数字以此来实现主键字段的自动、唯一增长,并且一个序列可为多列、多表同时使用。
序列消除了串行化并且提高了应用程序一致性。
二,创建
CREATE SEQUENCE SEQ_1 --序列名称
INCREMENT BY 1 -- 步长,每次加1(也可以为负数,表示降序)
START WITH 1 -- 从1开始计数
MINvalue 1 --设置最小值为1
NOMAXvalue -- 不设置最大值
NOCYCLE /* 一直累加,不循环(设置循环则在达到最大值后下一个值从最小值minvalue开始循环)*/
CACHE 10; /*设置缓存cache个序列,以保证序列的连续,如果设置为 NOCACHE,系统down掉了或者其它情况将会导致序列不连续*/
三,获取sequence的值
1.nextval
第一次使用返回初始值,之后使用按照步长增加序列的值,返回增加后的值
sql语句如下:
select SEQ_1.nextval from dual;
第一次执行结果如下:
第二次执行结果如下:
2.currval
返回sequence当前值
sql语句如下:
select SEQ_1.currval from dual;
执行结果如下:
currval要注意的是:第一次执行currval会报错,我的理解是,还没有生成第一个值,需要用nextval生成第一个值,之后才能使用currval
第一次使用currval报错如下:
之后使用currval正常,结果如下:
3.可能有些跟我一样刚接触oracle的同学对dual还不是太了解,下面这个资料会对你们有所帮助:
oracle中的dual用途
四,修改
修改自己模式sequence需要alter object权限,修改其他模式序列需要alter any sequence权限。
sql语句都是很基本的,跟修改表规律差不多,alter(修改) sequence(序列) SEQ_1(序列名) MINvalue(需要修改的项) 2(修改的值);
注意:
1.不能修改初始值,想修改初始值只能重建序列
2.设置maxvalue要大于minvalue且大于当前值,比如当前值为5
同理,设置minvalue要小于maxvalue且小于当前值
五,删除
删除序列必须要有drop any sequence权限
sql语句如下:
drop sequence SEQ_1;
删除结果如下图所示:
以上有什么不对的地方,还请在评论中指出,好加以改正。