pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
CREATE SEQUENCE — 定义一个新的序列发生器
CREATE [ TEMPORARY | TEMP ] SEQUENCEname[ INCREMENT [ BY ]increment] [ MINVALUEminvalue| NO MINVALUE ] [ MAXVALUEmaxvalue| NO MAXVALUE ] [ START [ WITH ]start] [ CACHEcache] [ [ NO ] CYCLE ] [ OWNED BY {table.column| NONE } ]
CREATE SEQUENCE创建一个新的序列号发生器。这会创建并 初始化一个名为name的特殊单行表。该发生器归发出该命令 的用户所有。
如果给定了模式名,则序列会在指定模式中创建。否则,它会在当前模式中 创建。临时序列存在于一个特殊模式中,因此创建临时序列时不能指定模式 名。序列名必须不同于同一模式中任何其他关系(表、序列、索引、视图、 物化视图或外部表)的名称。
创建序列后,可以使用函数 nextval、 currval以及 setval来操作该序列。这些函数的文档见 第 9.15 节。
虽然不能直接更新序列,但可以使用如下查询:
SELECT * FROM name;
来查看序列的参数和当前状态。特别是,序列的 last_value字段会显示任一会话最近分配的值。(当然, 如果其他会话正在调用nextval,那么到该值被打印出来 时,它可能已经过时。)
TEMPORARY or TEMP如果指定该项,则该序列对象只为当前会话创建,并会在会话退出时自动 删除。临时序列存在期间,已有的同名永久序列在本会话中不可见,除非 使用模式限定名来引用它们。
name要创建的序列的名称(可以是模式限定的)。
increment可选子句INCREMENT BY 指定加到当前序列值上以生成新值的增量。正值生成升序序列,负值生成降序序列。默认值为 1。increment
minvalueNO MINVALUE可选子句MINVALUE 确定序列可生成的 最小值。如果未提供此子句,或者指定了 minvalueNO MINVALUE,则使用默认值。升序序列和降序序列的 默认值分别为 1 和 -263-1。
maxvalueNO MAXVALUE可选子句MAXVALUE 确定序列的最大值。 如果未提供此子句,或者指定了 maxvalueNO MAXVALUE,则使用默认值。升序序列和降序序列的 默认值分别为 263-1 和 -1。
start可选子句START WITH 允许序列从任意值开始。升序序列的默认起始值为startminvalue,降序序列则为maxvalue。
cache可选子句CACHE 指定要预分配并存储在内存中以加快访问的序列号数量。最小值为 1(一次只能生成一个值,即不缓存),这也是默认值。cache
CYCLENO CYCLECYCLE选项允许序列在升序序列达到maxvalue、或降序序列达到minvalue时分别回绕。如果达到该限制, 下一个生成的数字将分别是minvalue或maxvalue。
如果指定NO CYCLE,则当序列达到其限值后,任何对 nextval的调用都会返回错误。如果既未指定 CYCLE也未指定NO CYCLE,则 默认使用NO CYCLE。
OWNED BY table.columnOWNED BY NONEOWNED BY选项使序列与特定表列关联,从而在删除该列(或整个表)时,也自动删除该序列。指定表必须与序列具有相同的所有者,并且位于同一模式中。默认值OWNED BY NONE表示不存在这种关联。
使用DROP SEQUENCE删除序列。
序列基于bigint算术,因此其范围不能超过八字节整数的范围 (-9223372036854775808 到 9223372036854775807)。
如果对一个将由多个会话并发使用的序列对象设置了大于 1 的cache,则可能得到意想不到的结果。 每个会话会在一次访问该序列对象时分配并缓存连续的序列值,并相应增加 该序列对象的last_value。随后,该会话中接下来的 cache-1 次nextval 调用会直接返回预分配的值,而不接触序列对象。因此,任何在会话中已分配 但未使用的数字都会在会话结束时丢失,从而在序列中造成“空洞”。
此外,虽然多个会话保证会分配到互不相同的序列值,但从所有会话整体来看, 这些值的生成顺序可能会乱序。例如,当cache设置为 10 时,会话 A 可能保留值 1..10 并返回nextval=1;然后会话 B 可能保留值 11..20 并返回nextval=11,而此时会话 A 尚未生成 nextval=2。因此,当cache设置为 1 时,可以安全地假定 nextval值按顺序生成;当cache设置大于 1 时,只应假定 nextval值彼此不同,而不应假定它们严格按顺序生成。 此外,last_value会反映任一会话最近保留的值,不管该值 是否已经由nextval返回。
另一个需要注意的问题是,在这种序列上执行的setval 不会立刻被其他会话察觉,直到它们用完自己缓存的所有预分配值为止。
创建一个名为serial的升序序列,从 101 开始:
CREATE SEQUENCE serial START 101;
从该序列中取出下一个数字:
SELECT nextval('serial');
nextval
---------
101
从该序列中取出下一个数字:
SELECT nextval('serial');
nextval
---------
102
在INSERT命令中使用该序列:
INSERT INTO distributors VALUES (nextval('serial'), 'nothing');
在一次COPY FROM之后更新序列值:
BEGIN;
COPY distributors FROM 'input_file';
SELECT setval('serial', max(id)) FROM distributors;
END;
CREATE SEQUENCE符合SQL 标准,但下列情况除外:
不支持标准的AS <data type>表达式。
获取下一个值是使用nextval()函数,而不是标准的 NEXT VALUE FOR表达式完成的。
OWNED BY子句是PostgreSQL扩展。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。