主键primary key(id,sendTm)中的id字段auto_increment转换为auto_random报错

【TiDB 使用环境】测试环境验证
【TiDB 版本】8.5.5
【部署方式】云上部署(华为云)自建
【集群节点数】3kv 3pd 3tidb

【问题】因现有表的id使用auto_increment,存在热点问题,计划使用auto_random来替代auto_increment,但在验证时提示:ERROR 8216 (HY000): Invalid auto random: auto_random can only be converted from auto_increment clustered primary key

【表结构】
CREATE TABLE test_auto_random (
id bigint AUTO_INCREMENT COMMENT ‘主键ID’,
sendTm timestamp NOT NULL COMMENT ‘发送时间’,
data varchar(100) DEFAULT NULL,
PRIMARY KEY (id,sendTm) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=1021002080801 COMMENT=‘记录表2’
PARTITION BY RANGE (UNIX_TIMESTAMP(sendTm)) (
PARTITION p20260214 VALUES LESS THAN (1770998400),
PARTITION p20260215 VALUES LESS THAN (1771084800)
);

【执行日志】
mysql> SET SESSION tidb_allow_remove_auto_inc = ON;
Query OK, 0 rows affected (0.00 sec)
mysql> SET SESSION tidb_allow_remove_auto_inc = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> ALTER TABLE test_auto_random MODIFY COLUMN id BIGINT NOT NULL AUTO_RANDOM(5) COMMENT ‘主键ID’;
ERROR 8216 (HY000): Invalid auto random: auto_random can only be converted from auto_increment clustered primary key

是不是值太大了?

1 个赞

从功能上来说,是支持修改的。

不知道是不是使用了联合主键的原因,但官方又没说这个。
PRIMARY KEY (id ,sendTm )

使用id为主键时,PRIMARY KEY (id ) 没有这个问题

直接修改的话,会不会导致id重复呢

ERROR 8216 (HY000): Invalid auto random: auto_random can only be converted from auto_increment clustered primary key,描述没问题, PRIMARY KEY (id ,sendTm ) 不符合 auto_increment clustered primary key 这个描述

虽然主键是聚簇的,但它是一个联合主键,而 TiDB 要求:

  • 要转换为 AUTO_RANDOM 的字段,必须是单一主键,而不是联合主键的一部分。
  • 这是因为 AUTO_RANDOM 用于生成唯一的行标识,其语义要求它必须是主键的唯一组成部分。

看了你的SQL,你目前使用了AUTO_RANDOM,必须将主键改为仅含id的单列主键并重建表。

你这个答案最符合实际情况,但没有在官网中找到相关的出处。

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。