Name
CREATE SEQUENCE
-- 创建一个新的序列发生器
Synopsis
CREATE [ TEMPORARY | TEMP ] SEQUENCE
seqname
[ INCREMENT
increment
]
[ MINVALUE
minvalue
] [ MAXVALUE
maxvalue
]
[ START
start
] [ CACHE
cache
] [ 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)
.
如果没有 CYCLE,那么在到达极限之后再调用
nextval
将返回错误.
输出
-
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
,
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
将不会被
其它后端知晓,直道它们用光所有预先分配的缓存数值.
|
注意
使用
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 SEQUENCE
是
PostgreSQL
语言扩展.
在
SQL92
里没有
CREATE SEQUENCE
语句.
|