本文分为序列的定义、修改以及删除进行讲解
1)
序列定义
序列是一个数据库实体,通过它多个用户可以产生唯一整数值,可以用序列来自动地生
成主关键字值。
语法格式
CREATE SEQUENCE [ <
模式名
>.] <
序列名
> [ <
序列选项列表
>];
<
序列选项列表
> ::= <
序列选项
>{<
序列选项
>}
<
序列选项
> ::=
INCREMENT
BY <
增量值
>|
START
WITH <
初值
>|
MAXVALUE
<
最大值
>|
NOMAXVALUE
|
MINVALUE
<
最小值
>|
NOMINVALUE
|
CYCLE
|
NOCYCLE
|
CACHE
<
缓存值
>|
NOCACHE
|
ORDER
|
NOORDER |
GLOBAL |
LOCAL
参数
1. <
模式名
>
指明被创建的序列属于哪个模式,缺省为当前模式;
2. <
序列名
>
指明被创建的序列的名称,序列名称最大长度
128
字节;
138
第 3 章 数据定义语句
3. <
增量值
>
指定序列数之间的间隔,这个值可以是
[-1000000, 1000000]
之间
任意的
DM
正整数或负整数,但不能为
0
。如果此值为负,序列是下降的,如果此值
为正,序列是上升的。如果忽略
INCREMENT BY
子句,则间隔缺省为
1
。增量值的
绝对值必须小于
(<
最大值
> - <
最小值
>)
;
4. <
初值
>
指定被生成的第一个序列数,可以用这个选项来从比最小值大的一个值
开始升序序列或比最大值小的一个值开始降序序列。对于升序序列,缺省值为序列
的最小值,对于降序序列,缺省值为序列的最大值;
5. <
最大值
>
指定序列能生成的最大值,如果忽略
MAXVALUE
子句,则降序序列的最
大值缺省为
-1
,升序序列的最大值 缺 省 为
9223372036854775807(0x7FFFFFFFFFFFFFFF)
,若指定的最大值超出缺省
最大值,则
DM
自动将最大值置为缺省最大值。非循环序列在到达最大值之后,将
不能继续生成序列数;
6. <
最小值
>
指定序列能生成的最小值,如果忽略
MINVALUE
子句,则升序序列的最
小值缺省为
1
,降序序列的最小值 缺 省 为
-9223372036854775808(0x8000000000000000)
,若指定的最小值超出缺省
最小值,则
DM
自动将最小值置为缺省最小值。循环序列在到达最小值之后,将不
能继续生成序列数。最小值必须小于最大值;
7. CYCLE
该关键字指定序列为循环序列:当序列的值达到最大值
/
最小值时,序列
将从最小值
/
最大值计数;
8. NOCYCLE
该关键字指定序列为非循环序列:当序列的值达到最大值
/
最小值时,
序列将不再产生新值;
9. CACHE
该关键字表示序列的值是预先分配,并保持在内存中,以便更快地访问;
<
缓存值
>
指定预先分配的值的个数,最小值为
2
;最大值为
50000
;且缓存值不能
大于
(<
最大值
> - <
最小值
>)/<
增量值
>
;
10. NOCACHE
该关键字表示序列的值是不预先分配;
11. ORDER
该关键字表示以保证请求顺序生成序列号;
12. NOORDER
该关键字表示不保证请求顺序生成序列号;
13. GLOBAL
该关键字表示
MPP
环境下序列为全局序列,缺省为
GLOBAL
;
14. LOCAL
改关键字表示
MPP
环境下序列为本地序列。


语句功能
创建一个序列。只有
DBA
或该序列的拥有者且具有
CREATE SEQUENCE
权限的用户才
能创建序列。
使用说明
1.
一旦序列生成,就可以在
SQL
语句中用以下伪列来存取序列的值;
1
)
CURRVAL
返回当前的序列值;
2
)
NEXTVAL
如果为升序序列,序列值增加并返回增加后的值;如果为降序序列,
序列值减少并返回减少后的值。如果第一次对序列使用该函数,则返回序列当
前值;
3
) 用户会话在第一次使用
CURRVAL
之前应先使用
NEXTVAL
获取序列当前值;
之后除非会话使用
NEXTVAL
获取序列当前值,否则每次使用
CURRVAL
返回
的值不变。
2.
缺省序列:如果在序列中什么也没有指出则缺省生成序列,一个从
1
开始增量为
1
且无限上升
(
最大值为
9223372036854775807)
的升序序列;仅指出
INCREMENT BY -1
,将创建一个从
-1
开始且无限下降
(
最小值为
-9223372036854775808)
的降序序列。
3. LOCAL
类型序列的最高
10
位用来记录标识
MPP
节点号,因此
LOCAL
类型的序列
值和
GLOBAL
类型序列在范围、最大值、最小值上都有所差别。
LOCAL
类型序列
创建时可设置的最大值、最小值分别为
9007199254740991
、
-9007199254740992
。需要注意的是,最高
10
位设置了
MPP
站点号以后,序
140
第 3 章 数据定义语句
列的真实值实际上可能不会在序列定义的最大最小值范围内。
举例说明
例 创建序列
SEQ_QUANTITY
,将序列的前两个值插入表
PRODUCTION.PRODUCT_INVENTORY
中。
(1)
创建序列
SEQ_QUANTITY
CREATE SEQUENCE SEQ_QUANTITY INCREMENT BY 10;
(2)
将序列的第一个值插入表
PRODUCT_INVENTORY
中
INSERT INTO PRODUCTION.PRODUCT_INVENTORY VALUES(1,1,
SEQ_QUANTITY.NEXTVAL);
SELECT * FROM PRODUCTION.PRODUCT_INVENTORY;
查询结果为:表
PRODUCT_INVENTORY
增加一行,列
QUANTITY
的值为
1
(3)
将序列的第二个值插入表
PRODUCT_INVENTORY
中
INSERT INTO PRODUCTION.PRODUCT_INVENTORY VALUES(1,1,
SEQ_QUANTITY.NEXTVAL);
SELECT * FROM PRODUCTION.PRODUCT_INVENTORY;
查询结果为:表
PRODUCT_INVENTORY
增加两行,列
QUANTITY
的值分别为
1
,
11
2)
序列修改语句
DM
系统提供序列修改语句,包括修改序列步长值、设置序列最大值和最小值、改变序
列的缓存值、循环属性、
ORDER
属性。
语法格式
ALTER SEQUENCE [ <
模式名
>.] <
序列名
> [ <
序列修改选项列表
>];
<
序列选项列表
> ::= <
序列修改选项
>{<
序列修改选项
>}
<
序列修改选项
> ::=
INCREMENT
BY <
增量值
>|
MAXVALUE
<
最大值
>|
NOMAXVALUE
|
MINVALUE
<
最小值
>|
NOMINVALUE
|
CYCLE
|
NOCYCLE
|
CACHE
<
缓存值
>|
NOCACHE
|
ORDER
|
NOORDER
参数
与序列定义语句的参数相同。
图例

语句功能
修改一个序列,只有
DBA
或该序列的拥有者或具有
ALTER ANY SEQUENCE
权限的用
户才修改序列。
使用说明
1.
关于步长的修改,分两种情况:
a)
如果在修改前没有用
NEXTVAL
访问序列,创建完序列后直接修改序列步长值,
则序列的当前值为起始值加上新步长值与旧步长值的差;
b)
如果在修改前用
NEXTVAL
访问了序列,然后修改序列步长值,则再次访问序
列的当前值为序列的上一次的值加上新步长值。
2.
缺省序列选项:如果在修改序列语句中没有指出某选项则缺省是修改前的选项值。
不允许未指定任何选项、禁止重复或冲突的选项说明;
3.
序列的起始值不能修改;
4.
修改序列的最小值不能大于起始值、最大值不能小于起始值;
5.
修改序列的步长的绝对值必须小于
MAXVALUE
与
MINVALUE
的差;
6.
序列的当前值不能大于最大值,不能小于最小值。
举例说明
例
1
创建完序列后直接修改序列的步长。
CREATE SEQUENCE SEQ1 INCREMENT BY 1000 START WITH 5 NOMAXVALUE NOMINVALUE
CACHE 10;
ALTER SEQUENCE SEQ1 INCREMENT BY 1 ;
SELECT SEQ1.NEXTVAL FROM DUAL;
查询结果为:
-994
例
2
创建序列后使用
NEXTVAL
访问了序列,然后修改步长。
CREATE SEQUENCE SEQ2 INCREMENT BY 1000 START WITH 5 NOMAXVALUE NOMINVALUE
NOCACHE ;
142
第 3 章 数据定义语句
SELECT SEQ2.NEXTVAL FROM DUAL;
ALTER SEQUENCE SEQ2 INCREMENT BY 1 ;
SELECT SEQ2.NEXTVAL FROM DUAL;
查询结果为:
6
例
3
修改序列的最小值。
CREATE SEQUENCE SEQ3 INCREMENT BY 1 START WITH 100 MINVALUE 3 ;
ALTER SEQUENCE SEQ3 MINVALUE 2;
3)
序列删除语句
DM
系统允许用户在建立序列后还可随时删除序列。
语法格式
DROP SEQUENCE [ <
模式名
>.]<
序列名
>;
参数
1. <
模式名
>
指明被删除序列所属的模式,缺省为当前模式;
2. <
序列名
>
指明被删除序列的名称。

语句功能
供具有
DBA
角色的用户或该序列的拥有者从数据库中删除序列生成器。
使用说明
一种重新启动序列生成器的方法就是删除它然后再重新创建,例如有一序列生成器当前
值为
150
,而且用户想要从值
27
开始重新启动此序列生成器,他可以:
1)
删除此序列生成器;
2)
重新以相同的名字创建序列生成器,
START WITH
选项值为
27
。
举例说明
例 用户
SYSDBA
需要删除序列
SEQ_QUANTITY
,可以用下面的语句:
DROP SEQUENCE SEQ_QUANTITY;