前言
前面因为项目数据导数据,我们介绍过《Oracle通过ODBC连接SQL Server数据库》,在实际导入过程中新的数据表结构里面存在不少ID的列,所以就用到了Oracle的序列,这一章我们就来介绍一下Oracle的序列(Oracle Sequence)。
Sequence介绍
Sequence是数据库系统按照一定的规则自动增加的数字序列,主要用于生成数据库数据记录。这个序列一般作为代理主键(因为不会重复)。
Sequence是数据中一个特殊存放等差数列的表,该表受数据库系统控制,任何时候数据库系统都可以根据当前记录数大小加上步长来获取到该表下一条记录应该是多少,这个表没有实际意义,常常用来做主键用。Sequence是数据库系统的特性,有的数据库有Sequence,有的没有。比如Oracle、DB2、PostgreSQL数据库有Sequence,MySQL、SQL Server、Sybase等数据库则没有Sequence。
Sequence创建
序列的创建语法:create sequence
注:在创建序列之前用户需要有CREATE SEQUENCE 或者CREATE ANY SEQUENCE权限。
创建序列代码
代码语言:javascript复制-- Create sequence
create sequence SEQ_INFO_CHG --Sequence实例名
minvalue 1 --最小值,可以设置为0
maxvalue 2147483647 --最大值
start with 1 --从1开始计数
increment by 1 --每次加几个
cache 20; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
还有一种写法
代码语言:javascript复制CREATE SEQUENCE SEQ_INFO_CHG
START WITH 1 -- 从1开始计数
NOMAXvalue -- 不设置最大值
INCREMENT BY 1 -- 每次加几个
NOCYCLE -- 一直累加,不循环
CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
Sequence使用
通过上面的创建好Sequence后就可以通过currVal与nextVal进行使用。
currVal:返回 sequence的当前值
代码语言:javascript复制select SEQ_INFO_CHG.currVal from dual;
nextVal:增加sequence的值,然后返回增加后sequence值
代码语言:javascript复制select SEQ_INFO_CHG.nextVal from dual;
在Sql语句中可以使用sequence的地方:
- 不包含子查询、snapshot、VIEW的 SELECT 语句
- INSERT语句的子查询中
- INSERT语句的values中
- UPDATE 的 SET中
使用Currval和nextVal的注意事项:
- CURRVAL总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。
- 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。
Sequence修改
拥有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须drop sequence再 re-create。
修改最大值
代码语言:javascript复制 alter sequence SEQ_INFO_CHG maxvalue 9999999;
修改多个值
代码语言:javascript复制alter sequence SEQ_INFO_CHG
increment by 10
maxvalue 10000
cycle —-到10000后从头开始
nocache;
Sequence删除
序列的删除语法:drop sequence
代码语言:javascript复制drop sequence SEQ_INFO_CHG;
-END-