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

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.1 已于 2006 年 4 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

CREATE SEQUENCE

CREATE SEQUENCE — 创建一个新的序列号发生器

大纲

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

输入

seqname

要创建的序列的名称。

increment

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

minvalue

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

maxvalue

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

start

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

cache

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

CYCLE

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

输出

CREATE

命令成功时返回的消息。

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 的新的 单行 表。该发生器将为发出命令的用户所有。

序列创建之后,可以用函数 nextval('seqname') 从序列获取一个新的数。 函数 currval('seqname') 可用来确定当前会话中对指定序列最后一次调用 nextval('seqname') 所返回的数。 函数 setval('seqname', newvalue) 可用来设置指定序列的当前值。 下一次调用 nextval('seqname') 将返回给定的值加上序列增量。

Use a query like

SELECT * FROM seqname;
   

to examine the parameters of a sequence. As an alternative to fetching the parameters from the original definition as above, you can use

SELECT last_value FROM seqname;
   

to obtain the last value allocated by any backend.

为了避免从同一序列获取数字的并发事务 被阻塞,nextval 操作从不回滚;也就是说,一旦取出了一个值, 它就被视为已使用,即使执行 nextval 的事务随后 中止也是如此。这意味着中止的事务可能在已赋值 的序列中留下未使用的"空洞"。setval 操作也从不 回滚。

小心

如果对一个将被多个后端并发使用的序列对象使用大于一的 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删除序列。

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

用法

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

CREATE SEQUENCE serial START 101;
  

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

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

在 INSERT 中使用该序列:

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

在 COPY FROM 之后设置序列值:

CREATE FUNCTION distributors_id_max() RETURNS INT4
    AS 'SELECT max(id) FROM distributors' 
    LANGUAGE 'sql';
BEGIN;
    COPY distributors FROM 'input_file';
    SELECT setval('serial', distributors_id_max());
END;
   

兼容性

SQL92

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

提交更正

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