sequence的管理

CREATE SEQUENCE
名称
CREATE SEQUENCE — 创建一个新的序列号生成器

语法
CREATE SEQUENCE seqname [ INCREMENT increment ]
    [ MINVALUE minvalue ] [ MAXVALUE maxvalue ]
    [ START start ] [ CACHE cache ] [ CYCLE ]
输入
seqname
将要创建的序列号名.
increment
INCREMENT increment 子句是可选的.一个正数将生成一个递增的序列,一个负数将生成一个递减的序列.缺省值是一(1).
minvalue
可选的子句 MINVALUE minvalue 决定一个序列可生成的最小值.缺省分别是递增序列为1递减为-2147483647.
maxvalue
使用可选子句 MAXVALUE maxvalue 决定序列的最大值.缺省的分别是递增为2147483647,递减为-1.
start
可选的 START start 子句 使序列可以从任意位置开始.缺省初始值是递增序列为 minvalue 递减序列为 maxvalue .
cache
CACHE cache 选项使序列号预分配并且为快速访问存储在内存里面.最小值(也是缺省值)是1(一次只能生成一个值, 也就是说没有缓存).
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) 调用将返回所给的值加上序列增值.

使用象

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曾返回过的.

注意
请参考 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 语句.
============================================================

 

ALTER SEQUENCE
Name
ALTER SEQUENCE  --  更改一个序列生成器的定义
Synopsis
ALTER SEQUENCE name [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ RESTART [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
ALTER SEQUENCE name SET SCHEMA new_schema
  描述
ALTER SEQUENCE 命令修改一个现有的序列发生器的参数。 任何没有明确在 ALTER SEQUENCE
命令里声明的参数都将保留原先的设置。
要使用 ALTER SEQUENCE,你必须拥有该序列。 要改变一个序列的模式,你必须在新的模式上有 CREATE 权限。
参数
name
一个要修改的序列的名字(可以有模式修饰)。

increment
INCREMENT BY increment 子句是可选的。一个正数会让序列成为递增序列,负数则成为递减序列。
如果没有声明,将沿用原来的递增值。

minvalue
NO MINVALUE
可选的子句 MINVALUE minvalue 决定一个序列可以生成的最小的值。如果声明了 NO MINVALUE,
将使用缺省值, 对于递增和递减的序列分别是 1 和 -2^63-1。如果没有声明任何选项,则沿用
当前的最小值。

maxvalue
NO MAXVALUE
可选的子句 MAXVALUE maxvalue 决定序列的最大值。如果声明了 NO MAXVALUE,则使用缺省值,
对于递增和递减的序列分别是 2^63-1 和 -1。如果两个选项都没有声明, 则沿用当前的最大值。

start
可选的RESTART WITH start 子句允许序列可以在任何地方开始。

cache
CACHE cache 选项打开序列号预分配并存储在内存缓冲的功能。最小值是 1 (也就是每次只能生
成一个数值,没有缓冲)。 如果没有声明,将沿用旧的缓冲值。

CYCLE
可选的键字 CYCLE 可以用于允许序列在达到递增序列的 maxvalue 或者递减序列的 minvalue的时
候重叠使用。 如果达到了极限,那么生成的下一个数字将分别是 minvalue 或者 maxvalue。
NO CYCLE
如果声明了可选键字 NO CYCLE,任何在序列达到其最大极限后对 nextval 的调用都将返回错误。
 如果既未声明 CYCLE 也未声明 NO CYCLE, 那么将沿用原有的循环行为。
new_schema

序列的新模式。
例子
从 105 开始重新开始一个叫 serial 的序列:
ALTER SEQUENCE serial RESTART WITH 105;
  注意
为了避免并发的事务从同一个序列获取数值的时候被阻塞住,ALTER SEQUENCE 操作从来不会回滚;
 修改马上生效并且不能恢复。
ALTER SEQUENCE 将不会立即影响后端的 nextval 结果,除了当前的之外, 因为它又已经缓冲
了的序列号。它们只有再使用光所有已经缓冲的数值之后才能意识到改变了的序列参数。当前
后端将立即被影响。

有些 ALTER TABLE 的变种可以和序列一起用; 比如,使用 ALTER TABLE RENAME 给一个序列
重命名。

兼容性
ALTER SEQUENCE 遵循 SQL 标准, 但是 SET SCHEMA 除外,这个是 PostgreSQL 扩展。

你可能感兴趣的:(sql,cache,PostgreSQL)