You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vitess是否仅在未分片keyspace中支持sequence(自增)?创建backing table存疑

Vitess Sequence(自增)功能:支持范围与操作顺序

是不是只支持未分片keyspace?

不是,分片keyspace也能使用sequence功能,但有个关键限制:sequence依赖的backing table必须放在未分片的keyspace里。

  • 未分片keyspace:可以直接在当前keyspace内创建backing table和sequence,绑定到本地表的字段上,逻辑最简单。
  • 分片keyspace:不能在分片keyspace里建sequence的backing table(否则会因为分片导致计数器状态混乱),需要先在某个未分片keyspace建好backing table和sequence,然后在分片keyspace的表中跨keyspace引用这个sequence。

正确的操作顺序(含分片场景)

不管哪种场景,核心顺序都是先建backing table,再创建sequence——因为sequence的自增计数器是存在backing table里的,没有这个表,sequence没法正常工作。

通用步骤(未分片keyspace场景)

  1. 先创建backing table(普通InnoDB表,结构固定):
    CREATE TABLE seq_backing (
      name VARCHAR(64) PRIMARY KEY,
      value BIGINT UNSIGNED NOT NULL DEFAULT 0
    ) ENGINE=InnoDB;
    
  2. 基于这个backing table创建sequence:
    CREATE SEQUENCE user_id_seq
      USING TABLE seq_backing
      START WITH 1
      INCREMENT BY 1;
    
  3. 在业务表中使用这个sequence作为字段默认值:
    CREATE TABLE user (
      id BIGINT UNSIGNED NOT NULL DEFAULT nextval(`user_id_seq`),
      username VARCHAR(50) NOT NULL,
      PRIMARY KEY(id)
    );
    

分片keyspace场景额外注意

如果你的业务表在分片keyspace里,只需要在引用sequence时加上未分片keyspace的前缀即可:

-- 假设未分片keyspace叫`unsharded`,sequence是`unsharded.user_id_seq`
CREATE TABLE sharded_user (
  id BIGINT UNSIGNED NOT NULL DEFAULT nextval(`unsharded.user_id_seq`),
  username VARCHAR(50) NOT NULL,
  PRIMARY KEY(id)
) COMMENT 'vitess_hash(id)';

内容的提问来源于stack exchange,提问作者GurbaniX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:30:02