CREATE [ TEMPORARY | TEMP ] SEQUENCE seqname [ INCREMENT [BY] increment ] [ MINVALUE minvalue ] [ MAXVALUE maxvalue ] [ START [WITH] start ] [ CACHE cache ] [NO] [ CYCLE ]
如果声明了这个修饰词,那么该序列对象只为这个会话创建, 并且在会话结束的时候自动删除.在临时序列存在的时候, 同名永久序列是不可见的(在同一会话里),除非它们是用 大纲修饰的名字引用的.
将要创建的序列号名(可以用大纲修饰).
INCREMENT increment 子句是可选的.一个正数将生成一个递增的序列, 一个负数将生成一个递减的序列.缺省值是一(1).
可选的子句 MINVALUE minvalue 决定一个序列可生成的最小值.缺省分别是递增序列为 1 递减为 -2^63-1.
使用可选子句 MAXVALUE maxvalue 决定序列的最大值.缺省的分别是递增为 -2^63-1,递减为 -1.
可选的 START start 子句 使序列可以从任意位置开始.缺省初始值是递增序列为 minvalue 递减序列为 maxvalue.
CACHE cache 选项使序列号预分配并且为快速访问存储在内存里面. 最小值(也是缺省值)是1(一次只能生成一个值, 也就是说没有缓存).
可选的CYCLE关键字可用于使序列到达 最大值(maxvalue) 或 最小值(minvalue) 时可复位并继续下去.如果达到极限,生成的下一个数据将分别是 最小值(minvalue) 或 最大值(maxvalue).
如果声明了可选的关键字 NO CYCLE,那么在序列达到 其最大值之后任何对 nextval 的调用都强返回一个 错误。如果既没有声明 CYCLE 也没有声明 NO CYCLE, 那么 NO CYCLE 是缺省。
命令成功执行的返回信息.
如果声明的序列已经存在.
如果声明的初始值超出范围,返回此信息.
如果声明的初始值超出范围,返回此信息.
如果最小值和最大值不连贯.
CREATE SEQUENCE 将向当前数据库里增加一个新的序列号生成器. 包括创建和初始化一个新的名为 seqname的 单行表.生成器将为使用此命令的用户"所有".
如果给出了一个大纲名,那么该序列是在指定大纲中创建的. 否则它会在当前大纲中创建(搜索路径前面的那个;参阅 CURRENT_SCHEMA()). TEMP(临时)序列存在于一个特殊的大纲中,因此如果创建一个 TEMP 序列的时候, 不能给出大纲名. 序列名必需和同一大纲中的其他序列,表,索引,或者视图不同.
在序列创建后,你可以使用函数 nextval, currval 和 nextval 操作序列.这些函数在用户手册中有详细文档.
尽管你不能直接更新一个序列,但你可以使用象
SELECT * FROM seqname;
检查一个序列的参数和当前状态.特别是序列的 last_value 字段显示了任意后端进程分配的最后的数值. (当然,这些值在被打印出来的时候可能已经过时了 --- 如果其它进程 正积极地使用 nextval.)
Caution |
如果用语序列对象的cache 设置大于一, 而且该对象可能被多个后端同时使用就有可能产生不可预料的结果.每个后端 在访问过序列对象并递增序列对象的 last_value 后, 将分配跟在序列值后面"缓存数".这样,该后端在下面的 cache-1 次nextval调用将使用预分配好的数值, 而不对共享对象做任何更新. 所以,任何已经分配但在会话中没有使用的数字 将在会话结束时丢失.而且,尽管多个后端保证分配独立的序列值, 当考虑所有的后端时该数值却有可能是乱序的.(例如,设置 cache为10, 后端 A 可能保留数值 1..10 并且返回nextval=1, 而后端 B 可能保留数值 11..20 并在后端 A 生成nextval=2 之 前返回nextval=11.)因此, 将cache 设为一可以安全地假设nextval的数值是顺序生成的; 当缓存数设置大于一,我 们只能假设nextval值都是独立的, 而不能假设它们都是纯粹顺序生成的. 同样,last_value将反映由任何后端保留的最 后数值,不管它是不是nextval曾返回过的. 另外一个问题是在这样的序列上执行的 setval 将不会被 其它后端知晓,直道它们用光所有预先分配的缓存数值. |
创建一个叫 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;