400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
YMatrix 文档
关于 YMatrix
标准集群部署
数据写入
数据迁移
数据查询
运维监控
参考指南
工具指南
数据类型
存储引擎
执行引擎
系统配置参数
SQL 参考
常见问题(FAQ)
新架构 FAQ
集群部署 FAQ
SQL 查询 FAQ
MatrixGate FAQ
运维 FAQ
监控告警 FAQ
PXF FAQ
PLPython FAQ
性能 FAQ
定义一个新的序列生成器。
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 数据库中对序列操作的函数存在一些限制:
尽管您无法直接更新序列,但可以使用类似以下的查询:
SELECT * FROM sequence_name;
检查序列的参数和当前状态。 特别是,序列的 last_value 字段显示了任何会话分配的最后一个值。
TEMPORARY | TEMP
name
increment
minvalue
NO MINVALUE
maxvalue
NO MAXVALUE
start
cache
CYCLE
NO CYCLE
OWNED BY table.column
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 标准,但以下情况除外: