CREATE SEQUENCE
CREATE SEQUENCE — 创建一个新的序列号发生器
大纲
CREATE SEQUENCEseqname[ INCREMENTincrement] [ MINVALUEminvalue] [ MAXVALUEmaxvalue] [ STARTstart] [ CACHEcache] [ CYCLE ]
输入
seqname要创建的序列的名称。
incrementINCREMENT子句是可选的。正值将生成递增序列,负值生成递减序列。默认值为一(1)。incrementminvalue可选子句
MINVALUE决定序列可以生成的最小值。递增和递减序列的默认值分别是 1 和 -2147483647。minvaluemaxvalue可选子句
MAXVALUE决定序列的最大值。递增和递减序列的默认值分别是 2147483647 和 -1。maxvaluestart可选的
START让序列可以从任何地方开始。默认起始值:递增序列为start子句minvalue,递减序列为maxvalue。cacheCACHE选项使序列号可以预分配并存储在内存中以便更快访问。最小值为 1(一次只能生成一个值,即不缓存),这也是默认值。cache- 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 语句。