CREATE SEQUENCE
功能描述
向当前数据库里增加一个新的序列。序列的Owner为创建此序列的用户。
注意事项
- SEQUENCE是一个存放等差数列的特殊表,该表受DBMS控制。这个表没有实际意义,通常用于为行或者表生成唯一的标识符。
- 如果给出一个模式名,则该序列就在给定的模式中创建,否则会在当前模式中创建。序列名必须和同一个模式中的其他序列、表、索引、视图或外表的名字不同。
- 创建序列后,在表中使用序列的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
将要创建的序列名称。
取值范围:仅可以使用小写字母(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
为了快速访问,而在内存中预先存储序列号的个数。一个缓存周期内,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
用于使序列达到maxvalue或者minvalue后可循环并继续下去。
如果声明了NO CYCLE,则在序列达到其最大值后任何对nextval的调用都会返回一个错误。
NOCYCLE的作用等价于NO CYCLE。
缺省值为NO CYCLE。
若定义序列为CYCLE,则不能保证序列的唯一性。
- OWNED BY-
将序列和一个表的指定字段进行关联。这样,在删除那个字段或其所在表的时候会自动删除已关联的序列。关联的表和序列的所有者必须是同一个用户,并且在同一个模式中。需要注意的是,通过指定OWNED BY,仅建立了表的对应列和Sequence之间关联关系,并不会在插入数据时在该列上产生自增序列。
缺省值为OWNED BY NONE,表示不存在这样的关联。
通过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) |