CREATE SEQUENCE

定义一个新的序列生成器。

概要

CREATE [TEMPORARY | TEMP] SEQUENCE name
        [INCREMENT [BY] value]
        [MINVALUE minvalue | NO MINVALUE]
        [MAXVALUE maxvalue | NO MAXVALUE]
        [START [ WITH ] start]
        [CACHE cache]
        [[NO] CYCLE]
        [OWNED BY { table.column | NONE }]

描述

CREATE SEQUENCE 创建一个新的序列生成器。 这涉及创建和初始化新的特殊单行表。 生成器将由发出命令的用户所有。

如果指定了模式名称,则会在指定的模式中创建序列。 否则,它将在当前模式中创建。 临时序列存在于特殊模式中,因此在创建临时序列时可能不会给出模式名称。 序列名称必须与同一模式中任何其他序列,表,索引,视图或外部表的名称不同。

创建序列后,可以使用 nextval() 函数对序列进行操作。 例如,要将行插入到获取序列的下一个值的表中:

INSERT INTO distributors VALUES (nextval('myserial'), 'acme');

您还可以使用函数 setval() 对序列进行操作,但仅用于不对分布式数据进行操作的查询。 例如,允许以下查询,因为它会重置 Master 上序列生成器进程的序列计数器值:

SELECT setval('myserial', 201);

但是以下查询在 YMatrix 数据库中将被拒绝,因为它对分布式数据进行操作:

INSERT INTO product VALUES (setval('myserial', 201), 'gizmo');

在常规(非分布式)数据库中,对序列进行操作的函数会转到本地序列表以根据需要获取值。 但是,请记住,在 YMatrix 数据库中,每个 Segment 都是其自己不同的数据库进程。 因此,Segment 需要一个真实单点来获取序列值,以便所有 Segment 正确递增,并且序列以正确的顺序前进。 序列服务器进程在 Master 上运行,并且是 YMatrix 分布式数据库中序列的真实点。 Segment 在运行时从 Master 获取序列值。

由于这种分布式序列设计,因此在 YMatrix 数据库中对序列操作的函数存在一些限制:

  • lastval() 和 currval() 函数不被支持。
  • setval() 仅可用于在 Master 上设置序列生成器的值,而不能在子查询中用于更新分布式表数据上的记录。
  • 根据查询的不同,nextval() 有时会从 Master 获取一个值块以供 Segment 使用。 因此,如果在 Segment 级别不需要所有块,有时可能会跳过序列中的值。 请注意,常规 PostgreSQL 数据库也可以执行此操作,因此这并不是 YMatrix 数据库所独有的。

尽管您无法直接更新序列,但可以使用类似以下的查询:

SELECT * FROM sequence_name;

检查序列的参数和当前状态。 特别是,序列的 last_value 字段显示了任何会话分配的最后一个值。

参数

TEMPORARY | TEMP

  • 如果指定,则仅为此会话创建序列对象,并在会话退出时自动将其删除。 具有相同名称的现有永久序列在临时序列存在时不可见(在此会话中),除非使用模式限定名称引用它们。

name

  • 要创建的序列的名称(可以由模式指定)。

increment

  • 指定将哪个值添加到当前序列值以创建新值。 正值将形成一个升序,负值将形成一个降序。默认值为 1。

minvalue

NO MINVALUE

  • 确定序列可以生成的最小值。 如果未提供此子句或指定了 NO MINVALUE,则将使用默认值。 升序和降序的默认值分别为 1 和 -263-1。

maxvalue

NO MAXVALUE

  • 确定序列的最大值。 如果未提供此子句或指定了 NO MAXVALUE,则将使用默认值。 升序和降序的默认值分别为 263-1 和 -1。

start

  • 允许序列从任何地方开始。 默认的起始值为升序的最小值和降序的最大值。

cache

  • 指定要预分配多少序号并将其存储在内存中,以加快访问速度。 最小(默认)值为 1(无高速缓存)。

CYCLE

NO CYCLE

  • 当达到最大值(递增)或最小值(递减)时,允许序列回绕。 如果达到限制,则生成的下一个数字将是最小值(升序)或最大值(降序)。 如果指定了 NO CYCLE,则在序列达到最大值之后,对 nextval() 的任何调用都将返回错误。 如果未指定,则默认为 NO CYCLE。

OWNED BY table.column

OWNED BY NONE

  • 使序列与特定的表列相关联,这样,如果该列(或其整个表)被删除,该序列也将被自动删除。 指定的表必须具有相同的所有者,并且与序列具有相同的模式。 OWNED BY NONE(默认值)指定不存在这种关联。

注解

序列基于 bigint 算术,因此范围不能超过八字节整数的范围(-9223372036854775808 至 9223372036854775807)。

尽管保证多个会话分配不同的序列值,但是当考虑所有会话时,这些值可能会不按顺序生成。 例如,会话 A 可能保留值 1..10 并返回 nextval = 1, 然后会话 B 可能保留值 11..20 并在会话 A 生成 nextval = 2 之前返回 nextval = 11。 因此,您仅应假设 nextval() 值都是不同的,而不是纯粹按顺序生成它们。 同样,last_value 将反映任何会话保留的最新值,无论 nextval() 是否已返回该值。

示例

创建一个名为 myseq 的序列:

CREATE SEQUENCE myseq START 101;

在表中插入一行,以获取名为 idseq 的序列的下一个值:

INSERT INTO distributors VALUES (nextval('idseq'), 'acme');

在 Master 上重置序列计数器值:

SELECT setval('myseq', 201);

在 YMatrix 数据库中非法使用 setval()(在分布式数据上设置序列值):

INSERT INTO product VALUES (setval('myseq', 201), 'gizmo');

兼容性

CREATE SEQUENCE 符合 SQL 标准,但以下情况除外:

  • 不支持 SQL 标准中指定的 ASdata_type 表达式。
  • 使用 nextval() 函数代替 SQL 标准中指定的 NEXT VALUE FOR 表达式来获取下一个值。
  • OWNED BY 子句是 YMatrix 数据库扩展。

另见

ALTER SEQUENCEDROP SEQUENCE