CREATE SEQUENCE seqname [ INCREMENT increment ] [ MINVALUE minvalue ] [ MAXVALUE maxvalue ] [ START start ] [ CACHE cache ] [ CYCLE ]
在序列创建后,你可以使用函数 nextval(seqname) 从序列中获得新的数字.函数 currval('seqname') 可用于获取对当前会话中指定序列的上一次 nextval(seqname) 调用返回的数字.函数 setval('seqname', newvalue) 可用于设置指定的序列的当前值.下一次 nextval(seqname) 调用将返回所给的值加上序列增值.
使用象
SELECT * FROM sequence_name;这样的查询可以获得序列的参数.除了获取最初的参数外,你可以用
SELECT last_value FROM sequence_name;获得后端分配的最后一个值.你可以使用
底层的锁定用于令多个请求同时调用生成器成为可能.
注意 |
如果用语序列对象的缓存的设置大于一,而且该对象可能被多个后端同时使用就有可能产生不可预料的结果.每个后端在访问过序列对象并递增序列对象的最后值后,将分配跟在序列值后面"缓存数".这样,该后端在下面的(缓存数-1)次返回序列值时将使用预分配好的数值,而不对共享对象做任何更新.所以,已经分配但在当前会话中没有使用的数字将会丢失.而且,尽管多个后端保证分配独立的序列值,当考虑所有的后端时该数值却有可能是乱序的.(例如,设置缓存数为10,后端 A 可能保留数值 1..10 并且返回 nextval=1,而后端 B 可能保留数值 11..20 并在后端A生成nextval=2之前返回 nextval=11.)因此,将缓存数设为一可以安全地假设 nextval 的数值是顺序生成的;当缓存数设置大于一,我们只能假设 nextval 值都是独立的,而不能假设它们都是纯粹顺序生成的.同样,last_value 将反映由任何后端保留的最后数值,不管它是不是nextval曾返回过的. |
每个后端使用其自身的缓存来存储分配的数字.已分配但当前会话没有使用的数字将丢失,导致序列里面出现"空洞".
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;