返回首页

gbase数据、南大通用产品文档:GBase8a

更新日期:2024年09月11日

管理用户定义函数(UDF) ............................
79

功能描述
CREATE SEQUENCE 用于向当前数据库里增加一个新的序列。
序列的Owner 为创建此
序列的用户。
序列Sequence 是用来产生唯一整数的数据库对象。序列的值是按照一定规则自增的整
数。因为自增所以不重复,因此说Sequence 具有唯一标识性。这也是Sequence 常被用作主
键的原因。
通过序列使某字段成为唯一标识符的方法有两种:

一种是声明字段的类型为序列整型,由数据库在后台自动创建一个对应的Sequence。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
944

另一种是使用CREATE SEQUENCE 自定义一个新的Sequence ,然后将
nextval('sequence_name')函数读取的序列值,指定为某一字段的默认值,这样该字段就
可以作为唯一标识符。
注意事项

Sequence 是一个存放等差数列的特殊表。这个表没有实际意义,通常用于为行或者表
生成唯一的标识符。

如果给出一个模式名,则该序列就在给定的模式中创建,否则会在当前模式中创建。序
列名必须和同一个模式中的其他序列、表、索引、视图或外表的名称不同。

创建序列后,
在表中使用序列的nextval()函数和generate_series(1,N)函数对表插入数据,
请保证nextval 的可调用次数大于等于N+1 次,
否则会因为generate_series()函数会调用
N+1 次而导致报错。

Sequence 默认最大值为2^63-1,如果使用了Large 标识则最大值可以支持到2^127-1。

被授予CREATE ANY SEQUENCE 权限的用户,可以在public 模式和用户模式下创建
序列。
语法格式
CREATE
[ TEMPORARY | TEMP ] [ LARGE ] SEQUENCE name [ INCREMENT [ BY ] increment ]
[ MINVALUE minvalue | NO MINVALUE | NOMINVALUE] [ MAXVALUE maxvalue | NO MAXVALUE
| NOMAXVALUE] [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE | NOCYCLE]
[ OWNED BY { table_name.column_name | NONE } ];
参数说明

[ TEMPORARY | TEMP ]
如果被指定,只会为这个会话创建序列对象,并且在会话退出时自动删除它。当临时
序列存在时,已有的同名永久序列(在这个会话中)会变得不可见,不过可以用模式限定
的名称来引用同名永久序列。

name
将要创建的序列名称。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
945
取值范围:仅可以使用小写字母(a~z)
、大写字母(A~Z)
、数字和特殊字符“#”,“_”,
“$”的组合。

increment
指定序列的步长。一个正数将生成一个递增的序列,一个负数将生成一个递减的序列。
缺省值为1。

MINVALUE minvalue | NO MINVALUE| NOMINVALUE
执行序列的最小值。如果没有声明minvalue 或者声明了NO MINVALUE,则递增序列
的缺省值为1,递减序列的缺省值为-263-1。NOMINVALUE 等价于NO MINVALUE

MAXVALUE maxvalue | NO MAXVALUE| NOMAXVALUE
执行序列的最大值。
如果没有声明maxvalue 或者声明了NO MAXVALUE,
则递增序列
的缺省值为263-1,递减序列的缺省值为-1。NOMAXVALUE 等价于NO MAXVALUE

start
指定序列的起始值。
缺省值:对于递增序列为minvalue,递减序列为maxvalue。

cache
为了快速访问,而在内存中预先存储序列号的个数。
缺省值为1,表示一次只能生成一个值,也就是没有缓存。

不建议同时定义cache 和maxvalue 或minvalue。
因为定义cache 后不能保证序列的
连续性,可能会产生空洞,造成序列号段浪费。

CYCLE
用于使序列达到maxvalue 或者minvalue 后可循环并继续下去。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
946
如果声明了NO CYCLE,则在序列达到其最大值后任何对nextval 的调用都会返回一个
错误。NOCYCLE 的作用等价于NO CYCLE。
若定义序列为CYCLE,则不能保证序列的唯一性。
缺省值为NO CYCLE。

OWNED BY
将序列和一个表的指定字段进行关联。
这样,
在删除那个字段或其所在表的时候会自动
删除已关联的序列。关联的表和序列的所有者必须是同一个用户,并且在同一个模式中。需
要注意的是,通过指定OWNED BY,仅仅是建立了表的对应列和sequence 之间关联关系,
并不会在插入数据时在该列上产生自增序列。
缺省值为OWNED BY NONE,表示不存在这样的关联。

通过OWNED BY 创建的Sequence 不建议用于其他表,如果希望多个表共享
Sequence,该Sequence 不应该从属于特定表。
示例
示例1
创建一个名为serial 的递增序列,从101 开始:
gbase=#CREATE SEQUENCE serial START 101 CACHE 20;
从序列中选出下一个数字:
gbase=#SELECT nextval('serial');
nextval
---------
101
从序列中选出下一个数字:
gbase=#SELECT nextval('serial');
nextval
---------
102

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
947
创建与表关联的序列:
gbase=#CREATE TABLE customer_address
(
ca_address_sk
integer
not null,
ca_address_id
char(16)
not null,
ca_street_number
char(10)
,
ca_street_name
varchar(60)
,
ca_street_type
char(15)
,
ca_suite_number
char(10)
,
ca_city
varchar(60)
,
ca_county
varchar(30)
,
ca_state
char(2)
,
ca_zip
char(10)
,
ca_country
varchar(20)
,
ca_gmt_offset
decimal(5,2)
,
ca_location_type
char(20)
);
gbase=#CREATE SEQUENCE serial1
START 101
CACHE 20
OWNED BY customer_address.ca_address_sk;
--删除表和序列
gbase=#DROP TABLE customer_address;
gbase=#DROP SEQUENCE serial cascade;
gbase=#DROP SEQUENCE serial1 cascade;
示例2
声明字段类型为序列整型来定义标识符字段。例如:
CREATE TABLE T1
(
id
serial,
name
text
);
当结果显示为如下信息,则表示创建成功。
NOTICE:
CREATE TABLE will create implicit sequence "t1_id_seq" for serial column
"t1.id"
CREATE TABLE

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
948
示例3
创建序列,并通过nextval('sequence_name')函数指定为某一字段的默认值。
CREATE SEQUENCE seq1 cache 100;
指定为某一字段的默认值,使该字段具有唯一标识属性。
CREATE TABLE T2
(
id
int not null default nextval('seq1'),
name text
);
指定序列与列的归属关系。将序列和一个表的指定字段进行关联。这样,
在删除那个字
段或其所在表的时候会自动删除已关联的序列。
ALTER SEQUENCE seq1 OWNED BY T2.id;
相关命令
DROP SEQUENCE,ALTER SEQUENCE

默认值1024
最大值2147483647
最小值1
分级查询的最大层级数,会影响计算使用的存储空间