↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本PostgreSQL 7.3 已于 2007 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

CREATE SEQUENCE

CREATE SEQUENCE — 定义一个新的序列发生器

大纲

CREATE [ TEMPORARY | TEMP ] SEQUENCE seqname [ INCREMENT increment ]
    [ MINVALUE minvalue ] [ MAXVALUE maxvalue ]
    [ START start ] [ CACHE cache ] [ CYCLE ]
  

输入

TEMPORARY or TEMP

如果指定该项,则该序列对象只为当前会话创建,并会在会话退出时自动 删除。临时序列存在期间,已有的同名永久序列在本会话中不可见,除非 使用模式限定名来引用它们。

seqname

要创建的序列的名称(可以用模式限定)。

increment

INCREMENT increment 子句是可选的。正值将生成 递增序列,负值生成递减序列。 默认值为一(1)。

minvalue

可选子句 MINVALUE minvalue 决定序列可以生成的 最小值。递增和递减序列的默认值分别是 1 和 -2^63-1。

maxvalue

可选子句 MAXVALUE maxvalue 决定序列的 最大值。递增和递减序列的默认值分别是 2^63-1 和 -1。

start

可选的 START start 子句让序列可以从任何地方开始。 默认起始值:递增序列为 minvalue, 递减序列为 maxvalue。

cache

CACHE cache 选项 使序列号可以预分配 并存储在内存中以便更快访问。最小值 为 1(一次只能生成一个值,即不缓存), 这也是默认值。

CYCLE

可选的 CYCLE 关键字可以让序列在 递增或递减序列分别达到 maxvalue 或 minvalue 时 回绕。如果到达了限制, 生成的下一个数将分别是 minvalue 或 maxvalue。 不带 CYCLE 时,到达限制之后 nextval 调用将返回错误。

输出

CREATE SEQUENCE

命令成功时返回的消息。

ERROR: Relation 'seqname' already exists

指定的序列已存在。

ERROR: DefineSequence: MINVALUE (start) can't be >= MAXVALUE (max)

指定的起始值超出范围。

ERROR: DefineSequence: START value (start) can't be < MINVALUE (min)

指定的起始值超出范围。

ERROR: DefineSequence: MINVALUE (min) can't be >= MAXVALUE (max)

最小值和最大值不一致。

描述

CREATE SEQUENCE 将向当前数据库中输入一个新的序列号 发生器。这包括创建并初始化一个名为 seqname 的新的 单行 表。该发生器将为发出命令的用户所有。

如果给出了模式名,序列将在指定的 模式中创建。否则它将在当前模式(搜索路径 最前端的那个;见 CURRENT_SCHEMA())中创建。 TEMP 序列存在于一个特殊的模式中,因此创建 TEMP 序列时不能给出模式名。 序列名必须与同一模式中任何其他序列、 表、索引或视图的名称不同。

序列创建之后,用函数 nextval、 currval 和 setval 操作该序列。这些函数在 用户指南中有文档。

虽然你不能直接更新序列,但你可以使用像这样的查询

SELECT * FROM seqname;
   

to examine the parameters and current state of a sequence. In particular, the last_value field of the sequence shows the last value allocated by any backend process. (Of course, this value may be obsolete by the time it's printed, if other processes are actively doing nextval calls.)

小心

如果对一个将被多个后端并发使用的序列对象使用大于一的 cache 设置,可能得到 意外的结果。每个后端会在一次 访问序列对象期间分配并缓存若干连续的序列值, 并相应地增大序列对象的 last_value。之后,该后端内接下来 cache-1 次 nextval 使用只是返回预分配的值,而不再接触 共享对象。因此,会话中已分配但未使用的任何数字 都会在该会话结束时丢失。此外,虽然可以保证多个后端 分配到互不相同的序列值,但综合考虑所有后端时, 这些值可能不是按顺序生成的。 (例如,cache 设为 10 时,后端 A 可能保留值 1..10 并返回 nextval=1, 然后后端 B 可能保留值 11..20 并在后端 A 生成 nextval=2 之前返回 nextval=11。) 因此,cache 设为一时, 可以安全地假定 nextval 值是按顺序生成的; cache 设为大于一时,只应假定 nextval 的值互不相同,而不是纯粹按顺序生成的。 另外,last_value 反映的是任何后端保留的最新值, 无论它是否已被 nextval 返回。 还有一点要考虑:在这种序列上执行的 setval 在其他后端用完它们缓存的预分配 值之前不会被它们注意到。

注解

使用DROP SEQUENCE删除序列。

序列基于bigint算术,因此其范围不能超过八字节整数的范围 (-9223372036854775808 到 9223372036854775807)。在一些较老的平台上,编译器可能不支持八字节整数,此时序列将使用常规的integer算术(范围为 -2147483648 到 +2147483647)。

当 cache 大于 一时,每个后端用自己的缓存存储预分配的数字。 当前会话中已缓存但未使用的数字将会 丢失,从而在序列中留下“空洞”。

用法

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

CREATE SEQUENCE serial START 101;
  

从该序列中选择下一个数:

SELECT nextval('serial');
    
nextval
-------
    114
   

在 INSERT 中使用该序列:

INSERT INTO distributors VALUES (nextval('serial'), 'nothing');
   

在 COPY FROM 之后更新序列值:

BEGIN;
    COPY distributors FROM 'input_file';
    SELECT setval('serial', max(id)) FROM distributors;
END;
   

兼容性

SQL92

CREATE SEQUENCE 是一种 PostgreSQL 语言扩展。 SQL92 中没有 CREATE SEQUENCE 语句。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。