更新时间:2025-07-08 GMT+08:00
分享

CREATE SEQUENCE

功能描述

向当前数据库里增加一个新的序列。

序列是一个数据库对象,主要用于生成一系列唯一的、递增或递减的数值,通常用作表中的主键或唯一标识符。

注意事项

  • 创建序列的用户为该序列的所有者。
  • 如果指定了模式名称,则会在指定模式中创建序列,否则会在当前模式中创建。序列名必须和同一个模式中的其他序列、表、索引、视图或外表的名字不同。
  • 创建序列后,在表中使用序列的nextval()函数和generate_series(1,N)函数对表插入数据,请保证nextval的可调用次数大于等于N+1次,否则会因为generate_series()函数会调用N+1次而导致报错。
  • 不支持在template1数据库中创建SEQUENCE。

语法格式

1
2
3
4
CREATE SEQUENCE [ IF NOT EXISTS ] 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 } ];

参数说明

表1 CREATE SEQUENCE参数说明

参数

描述

取值范围

IF NOT EXISTS

指定IF NOT EXISTS时,若不存在同名SEQUENCE,则可以成功创建SEQUENCE。若已存在同名SEQUENCE,创建时不会报错,仅会提示该SEQUENCE已存在,且不执行任何操作。

该参数仅9.1.0及以上版本支持。

-

name

将要创建的序列名称。

字符串,需符合标识符命名规范

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

指定数据库预先缓存(预分配)多少个序列号到内存中,从而加快访问速度。一个缓存周期内,CN不再向GTM索取序列号,而是使用本地预先申请的序列号。

9.1.0.100及以上集群版本中缺省值由GUC参数default_sequence_cache控制。

  • 新安装的9.1.0.100及以上集群版本中,默认值为20。
  • 从低版本升级到9.1.0.100及以上集群版本,默认值为1。表示一次只能生成一个值,即没有缓存。
  • 不建议同时定义cache和maxvalue或minvalue。因为定义cache后不能保证序列的连续性,可能会产生空洞,造成序列号段浪费。
  • 建议cache值不要设置过大,否则会出现缓存序列号时(每个cache周期的第一个nextval)耗时过长的情况;同时建议cache值小于100000000。实际使用时应根据业务设置合理的cache值,既能保证快速访问,又不会浪费序列号。

CYCLE | NOCYCLE

当序列达到maxvalue或者minvalue时,允许序列可循环重新开始。

默认值为NO CYCLE,表示序列达到极大或极小值后将无法生成新值。NOCYCLE的作用等价于NO CYCLE。

  • 如果指定序列为CYCLE,则不能保证序列的唯一性。
  • 如果指定了NO CYCLE,则在序列达到其最大值后任何对nextval的调用都将返回错误。

-

OWNED BY

将序列与特定表的指定字段相关联。这样,如果该字段或其所在表被删除,该序列也将被自动删除。关联的表和序列的所有者必须是同一个用户,并且在同一个模式中。

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

  • 通过指定OWNED BY,仅建立了表的对应列和SEQUENCE之间关联关系,并不会在插入数据时在该列上产生自增序列。
  • 通过指定OWNED BY创建的SEQUENCE不建议用于其他表,如果希望多个表共享SEQUENCE,该SEQUENCE不应该从属于特定表。

示例

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

1
2
3
CREATE SEQUENCE serial
 START 101
 CACHE 20;

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

1
2
3
4
SELECT nextval('serial');
 nextval 
 ---------
      101

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

1
2
3
4
SELECT nextval('serial');
 nextval 
 ---------
      102

创建与表关联的序列。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
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;

使用serial创建主键自增序列表serial_table。

1
2
3
4
5
6
7
8
9
CREATE TABLE serial_table(a int, b serial);
INSERT INTO serial_table (a) VALUES (1),(2),(3);
SELECT * FROM serial_table ORDER BY b;
 a | b
---+---
 1 | 1
 2 | 2
 3 | 3
(3 rows)

相关链接

ALTER SEQUENCEDROP SEQUENCE

相关文档