一.Sequence简介
Sequence是数据库系统按照一定的规则自动增加的数字序列,主要用于生成数据库数据记录。这个序列一般作为代理主键(因为不会重复)。
Sequence是数据中一个特殊存放等差数列的表,该表受数据库系统控制,任何时候数据库系统都可以根据当前记录数大小加上步长来获取到该表下一条记录应该是多少,这个表没有实际意义,常常用来做主键用。Sequence是数据库系统的特性,有的数据库有Sequence,有的没有。比如Oracle、DB2、PostgreSQL数据库有Sequence,MySQL、SQL Server、Sybase等数据库则没有Sequence。
此处,主要讨论下oracle sequence的创建与使用,其他的大同小异。
二.Sequence创建
Create Sequence之前要获取CREATE SEQUENCE或者CREATE ANY SEQUENCE权限。
1 -- Create sequence 2 create sequence SEQ_PRODUCT_STANDARD_CHG --Sequence实例名 3 minvalue 1 --最小值,可以设置为0 4 maxvalue 2147483647 --最大值 5 start with 1 --从1开始计数 6 increment by 1 --每次加几个 7 cache 20; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
或者可以如下创建均是可以的
1 CREATE SEQUENCE SEQ_PRODUCT_STANDARD_CHG 2 START WITH 1 -- 从1开始计数 3 NOMAXvalue -- 不设置最大值 4 INCREMENT BY 1 -- 每次加几个 5 NOCYCLE -- 一直累加,不循环 6 CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
三. Sequence使用
创建好Sequence后就可以通过currVal与nextVal进行使用。
currVal:返回 sequence的当前值
nextVal: 增加sequence的值,然后返回 增加后sequence值
如得到上边创建Sequence值的语句为(其中kingstar为用户,该用户下其实可以省略):
1 select kingstar.SEQ_PRODUCT_STANDARD_CHG.currVal 2 from dual
在Sql语句中可以使用sequence的地方:
-
-
- 不包含子查询、snapshot、VIEW的 SELECT 语句
- INSERT语句的子查询中
- INSERT语句的values中
- UPDATE 的 SET中
-
注:1.CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。
2. 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。
四.Sequence 修改
拥有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再 re-create。
1 alter sequence kingstar.SEQ_PRODUCT_STANDARD_CHG maxvalue 9999999;
1 ALTER SEQUENCE kingstar.SEQ_PRODUCT_STANDARD_CHG 2 INCREMENT BY 10 3 MAXVALUE 10000 4 CYCLE — 到10000后从头开始 5 NOCACHE ;
五. Sequence删除
1 DROP SEQUENCE kingstar.SEQ_PRODUCT_STANDARD_CHG;