CREATE SEQUENCE seqname [ INCREMENT increment ] [ MINVALUE minvalue ] [ MAXVALUE maxvalue ] [ START start ] [ CACHE cache ] [ CYCLE ]
将要创建的序列号名.
INCREMENT increment 子句是可选的.一个正数将生成一个递增的序列, 一个负数将生成一个递减的序列.缺省值是一(1).
可选的子句 MINVALUE minvalue 决定一个序列可生成的最小值.缺省分别是递增序列为1递减为-2147483647.
使用可选子句 MAXVALUE maxvalue 决定序列的最大值.缺省的分别是递增为2147483647,递减为-1.
可选的 START start 子句 使序列可以从任意位置开始.缺省初始值是递增序列为 minvalue 递减序列为 maxvalue.
CACHE cache 选项使序列号预分配并且为快速访问存储在内存里面. 最小值(也是缺省值)是1(一次只能生成一个值, 也就是说没有缓存).
可选的 CYCLE 关键字可用于使序列到达 最大值(maxvalue) 或 最小值(minvalue) 时可复位并继续下去.如果达到极限,生成的下一个数据将分别是 最小值(minvalue) 或 最大值(maxvalue).
命令成功执行的返回信息.
如果声明的序列已经存在.
如果声明的初始值超出范围,返回此信息.
如果声明的初始值超出范围,返回此信息.
如果最小值和最大值不连贯.
CREATE SEQUENCE 将向当前数据库里增加一个新的序列号生成器. 包括创建和初始化一个新的名为 seqname的 单行表.生成器将为使用此命令的用户"所有".
在序列创建后,你可以使用函数 nextval(seqname) 从序列中获得新的数字. 函数 currval('seqname') 可用于获取对当前会话中指定序列的上一次 nextval(seqname) 调用返回的数字. 函数 setval('seqname', newvalue) 可用于设置指定的序列的当前值.下一次 nextval(seqname) 调用将返回所给的值加上序列增值.
使用象
SELECT * FROM seqname;这样的查询可以获得序列的参数.除了获取最初的参数外,你可以用
SELECT last_value FROM seqname;获得任意后端分配的最后一个值.
要避免从同一个序列获取数字的并发的事务的锁定, nextval 操作永不回卷;也就是说,一旦一个数值被抓走, 那么就认为它已经用过了,即使做 nextval 的事务稍后退出也一样. 这就意味着退出的事务可能在该序列的赋值里留下未用的"洞". setval 操作也从不回卷.
Caution |
如果用语序列对象的缓存的设置大于一, 而且该对象可能被多个后端同时使用就有可能产生不可预料的结果.每个后端 在访问过序列对象并递增序列对象的最后值后, 将分配跟在序列值后面"缓存数".这样,该后端在下面的(缓存数-1) 次返回序列值时将使用预分配好的数值,而不对共享对象做任何更新. 所以,已经分配但在当前会话中没有使用的数字 将会丢失.而且,尽管多个后端保证分配独立的序列值, 当考虑所有的后端时该数值却有可能是乱序的.(例如,设置 缓存数为10,后端 A 可能保留数值 1..10 并且返回 nextval=1, 而后端 B 可能保留数值 11..20 并在后端A生成nextval=2之 前返回 nextval=11.)因此, 将缓存数设为一可以安全地假设 nextval 的数值是顺序生成的; 当缓存数设置大于一,我 们只能假设 nextval 值都是独立的, 而不能假设它们都是纯粹顺序生成的. 同样,last_value 将反映由任何后端保留的最 后数值,不管它是不是nextval曾返回过的. |
创建一个叫 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;