合 PG中的序列
CREATE SEQUENCE
CREATE SEQUENCE — 定义一个新的序列发生器
大纲
1 2 3 4 | CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] name [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ] [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ] [ OWNED BY { table_name.column_name | NONE } ] |
描述
CREATE SEQUENCE
创建一个新的序列数 发生器。这涉及到用名称name
创建并且初始化 一个新的特殊的单行表。该发生器将由发出该命令的用户所拥有。
如果给出一个模式名称,则该序列将将被创建在指定的模式中。否则它会被 创建在当前模式中。临时序列存在于一个特殊的模式中,因此在创建临时序列 时不能给出模式名。序列名称必须与同一模式中任何其他序列、表、索引、 视图或者外部表的名称不同。
在序列被创建后,可以使用函数 nextval
、 currval
以及 setval
来操作该序列。这些函数在 第 9.17 节中有介绍。
尽管无法直接更新一个序列,可以使用这样的查询:
1 | SELECT * FROM name; |
来检查一个序列的参数以及当前状态。特别地,序列的 last_value
域显示被任意会话最后一次取得的值(当然, 在被打印时该值可能已经过时了,因为可能有其他会话正在执行 nextval
调用)。
参数
TEMPORARY
orTEMP
如果被指定,只会为这个会话创建序列对象,并且在会话退出时自动 删除它。当临时序列存在时,已有的同名永久序列(在这个会话中) 会变得不可见,不过可以用模式限定的名称来引用同名永久序列。
IF NOT EXISTS
如果已经存在一个同名的关系时不要抛出错误。这种情况下会发出一个 提示。注意这不保证现有的关系与即将创建的序列相似 — 它甚至可能 都不是一个序列。
name
要创建的序列的名称(可以是模式限定的)。
data_type
可选的子句
AS *
data_type*
制定序列的数据类型。有效类型是smallint
、integer
、 和bigint
。默认是bigint
。 数据类型决定了序列的默认最小和最大值。increment
可选的子句
INCREMENT BY *
increment*
指定为了 创建新值会把哪个值加到当前序列值上。一个正值将会创造一个上升 序列,负值会创造一个下降序列。默认值是 1。minvalue
NO MINVALUE
可选的子句
MINVALUE *
minvalue*
决定一个序列 能产生的最小值。如果没有提供这个子句或者指定了NO MINVALUE
,那么会使用默认值。 升序序列的默认值为1。降序序列的默认值为数据类型的最小值。maxvalue
NO MAXVALUE
可选的子句
MAXVALUE *
maxvalue*
决定该序列 的最大值。如果没有提供这个子句或者指定了NO MAXVALUE
,那么将会使用默认值。 升序序列的默认值是数据类型的最大值。降序序列的默认值是-1。start
可选的子句
START WITH *
start*
允许序列从任何 地方开始。对于上升序列和下降序列来说,默认的开始值分别是minvalue
和maxvalue
。cache
可选的子句
CACHE *
cache*
指定要预分配多少 个序列数并且把它们放在内存中以便快速访问。最小值为 1 (一次只生成 一个值,即没有缓存),默认值也是 1。CYCLE
NO CYCLE
对于上升序列和下降序列,
CYCLE
选项允许序列 在分别达到maxvalue
和minvalue
时回卷。如果达到 该限制,下一个产生的数字将分别是minvalue
和maxvalue
。如果指定了NO CYCLE
,当序列到达其最大值 后任何nextval
调用将返回一个错误。如果CYCLE
和NO CYCLE
都没有 被指定,则默认为NO CYCLE
。OWNED BY
table_name
.column_name
OWNED BY NONE
本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!