CREATE SEQUENCE

Name

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

Synopsis

CREATE [ TEMPORARY | TEMP ] SEQUENCE seqname [ INCREMENT [BY] increment ]
    [ MINVALUE minvalue ] [ MAXVALUE maxvalue ]
    [ START [WITH] start ] [ CACHE cache ] [NO] [ CYCLE ]
  

输入

TEMPORARY 或 TEMP

如果声明了这个修饰词,那么该序列对象只为这个会话创建, 并且在会话结束的时候自动删除.在临时序列存在的时候, 同名永久序列是不可见的(在同一会话里),除非它们是用 大纲修饰的名字引用的.

seqname

将要创建的序列号名(可以用大纲修饰).

increment

INCREMENT increment 子句是可选的.一个正数将生成一个递增的序列, 一个负数将生成一个递减的序列.缺省值是一(1).

minvalue

可选的子句 MINVALUE minvalue 决定一个序列可生成的最小值.缺省分别是递增序列为 1 递减为 -2^63-1.

maxvalue

使用可选子句 MAXVALUE maxvalue 决定序列的最大值.缺省的分别是递增为 -2^63-1,递减为 -1.

start

可选的 START start 子句 使序列可以从任意位置开始.缺省初始值是递增序列为 minvalue 递减序列为 maxvalue.

cache

CACHE cache 选项使序列号预分配并且为快速访问存储在内存里面. 最小值(也是缺省值)是1(一次只能生成一个值, 也就是说没有缓存).

CYCLE

可选的CYCLE关键字可用于使序列到达 最大值(maxvalue)最小值(minvalue) 时可复位并继续下去.如果达到极限,生成的下一个数据将分别是 最小值(minvalue)最大值(maxvalue)

NO CYCLE

如果声明了可选的关键字 NO CYCLE,那么在序列达到 其最大值之后任何对 nextval 的调用都强返回一个 错误。如果既没有声明 CYCLE 也没有声明 NO CYCLE, 那么 NO CYCLE 是缺省。

输出

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的 单行表.生成器将为使用此命令的用户"所有".

如果给出了一个大纲名,那么该序列是在指定大纲中创建的. 否则它会在当前大纲中创建(搜索路径前面的那个;参阅 CURRENT_SCHEMA()). TEMP(临时)序列存在于一个特殊的大纲中,因此如果创建一个 TEMP 序列的时候, 不能给出大纲名. 序列名必需和同一大纲中的其他序列,表,索引,或者视图不同.

在序列创建后,你可以使用函数 nextvalcurrvalnextval 操作序列.这些函数在用户手册中有详细文档.

尽管你不能直接更新一个序列,但你可以使用象

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 将不会被 其它后端知晓,直道它们用光所有预先分配的缓存数值.

注意

使用 DROP SEQUENCE 语句来删除序列.

序列是基于 bigint 运算的,因此其范围不能超过八字节的 整数范围(-9223372036854775808 到 9223372036854775807). 在一些老一点的平台上可能没有对八字节整数的编译器支持, 这种情况下序列使用普通的 integer 运算(范围是 -2147483648 到 +2147483647).

如果 cache 大于一,那么 每个后端使用其自身的缓存来存储分配的数字. 已分配但当前会话没有使用的数字将丢失,导致序列里面出现"空洞"

用法

创建一个叫 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;
   

兼容性

SQL92

CREATE SEQUENCEPostgreSQL 语言扩展. 在SQL92里没有 CREATE SEQUENCE 语句.