VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

CREATE SEQUENCE

功能描述

CREATE SEQUENCE用于向当前数据库里增加一个新的序列。序列的Owner为创建此序列的用户。

注意事项

  • Sequence是一个存放等差数列的特殊表。这个表没有实际意义,通常用于为行或者表生成唯一的标识符。
  • 如果给出一个模式名,则该序列就在给定的模式中创建,否则会在当前模式中创建。序列名必须和同一个模式中的其他序列、表、索引、视图或外表的名称不同。
  • 创建序列后,在表中使用序列的nextval()函数和generate_series(1,N)函数对表插入数据,请保证nextval的可调用次数大于等于N+1次,否则会因为generate_series()函数会调用N+1次而导致报错。
  • Sequence默认最大值为263-1,如果使用了Large标识则最大值可以支持到2127-1。
  • 被授予CREATE ANY SEQUENCE权限的用户,可以在public模式和用户模式下创建序列。

语法格式

CREATE [ TEMPORARY | TEMP ] [ LARGE ] SEQUENCE name
    [ AS data_type ]
    [ 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 } ];

参数说明

  • TEMPOPARY | TEMP

    如果声明了这个修饰词,那么该序列对象只为这个会话创建,并且在会话结束的时候自动删除。

    该功能仅在数据库兼容模式为PG时支持(即数据库实例初始化时指定DBCOMPATIBILITY='PG')。参见PostgreSQL兼容性的CREATE SEQUENCE

  • [ LARGE ]

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

  • name

    将要创建的序列名称。

    取值范围: 仅可以使用小写字母(a~z)、 大写字母(A~Z)、数字和特殊字符“#”,“_”,“$”的组合。

  • [ AS data_type ]

    序列的数据类型,Vastbase支持的数据类型有smallint、integer和bigint,其中bigint是默认值。

    该功能仅在数据库兼容模式为PG时支持(即数据库实例初始化时指定DBCOMPATIBILITY='PG')。参见PostgreSQL兼容性的CREATE SEQUENCE

  • 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后可循环并继续下去。

    如果声明了NO CYCLE,则在序列达到其最大值后任何对nextval的调用都会返回一个错误。

    NOCYCLE的作用等价于NO CYCLE。

    缺省值为NO CYCLE。

    若定义序列为CYCLE,则不能保证序列的唯一性。

  • OWNED BY

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

    缺省值为OWNED BY NONE,表示不存在这样的关联。

    通过OWNED BY创建的Sequence不建议用于其他表,如果希望多个表共享Sequence,该Sequence不应该从属于特定表。

示例

1、创建一个名为serial的递增序列,从101开始。

CREATE SEQUENCE serial START 101 CACHE 20;

2、从序列中选出下一个数字。

SELECT nextval('serial');

返回结果如下:

 nextval 
 ---------
     101
(1 row)

3、从序列中选出下一个数字。

SELECT nextval('serial');

返回结果为:

 nextval
---------
     102
(1 row)

4、创建测试表和与表关联的序列。

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)                     
);

CREATE SEQUENCE serial1 START 101 CACHE 20 OWNED BY customer_address.ca_address_sk;

5、删除表和序列。

DROP TABLE customer_address;
DROP SEQUENCE serial cascade;

相关链接

DROP SEQUENCEALTER SEQUENCE