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 } ]; |
参数说明
参数 |
描述 |
取值范围 |
---|---|---|
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控制。
|
|
CYCLE | NOCYCLE |
当序列达到maxvalue或者minvalue时,允许序列可循环重新开始。 默认值为NO CYCLE,表示序列达到极大或极小值后将无法生成新值。NOCYCLE的作用等价于NO CYCLE。
|
- |
OWNED BY |
将序列与特定表的指定字段相关联。这样,如果该字段或其所在表被删除,该序列也将被自动删除。关联的表和序列的所有者必须是同一个用户,并且在同一个模式中。 缺省值为OWNED BY NONE,表示不存在这种关联。 |
|
示例
创建一个名为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) |