把主键id改成auto_increment报错说这是住建不能改,这个怎么弄?

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
【资源配置】
【附件:截图/日志/监控】

原始的表是
CREATE TABLE model (
id bigint(20) unsigned NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */,
PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */,
KEY idx_model_group_id (model_group_id),
UNIQUE KEY uk_unique_identification (unique_identification)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![auto_rand_base] AUTO_RANDOM_BASE=150001 */

这样的,我使用navicat的数据同步功能将数据同步到另一个库中,变成了这样的
CREATE TABLE model (
id bigint(20) unsigned NOT NULL,
PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */,
KEY idx_model_group_id (model_group_id),
UNIQUE KEY uk_unique_identification (unique_identification)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

表中的AUTO_RANDOM属性丢失了,导致不能添加数据,报错说id缺失(不能自动生成了)。
使用ALTER TABLE model MODIFY COLUMN id bigint AUTO_RANDOM(5);更改,报错:


这个怎么解决?

新建表 select into ;drop table oldname;rename table to oldname

– SELECT * INTO unique_check_backup FROM unique_check; 不支持

INSERT INTO unique_check_backup SELECT * FROM unique_check;

确实不能改,只能重建表然后把数据插进去

你可以先在目标端创建好表结构,然后再用navicat 进行数据同步,这样就可以了。
现在的话,已经生成了,就不能改了,需要重建的。

官方对auto_random 也做了 使用限制的说明的,你看下

这个真的不能改

改是没办法直接改了,只能通过重建表来改。
不过可以排查一下navicat用的driver是不是MySQL官方的driver?mariaDB的driver会默认忽略注释的,导致 /*T![auto_rand] AUTO_RANDOM(5) */`这类的属性被忽略,被创建成普通表了。

1 个赞

聚簇索引不能改

你看下主键是否被其他表引用了,如果是,先解除引用关系,然后在修改试试

只能重建表,没有别的办法。

1 个赞

主键不能发生变更,主键和表id用来定位唯一一条数据

是用来定位唯一数据,现在只是想修改它的自增类型,字段名不修改

主键不能更改

只能重建了

你这个是CLUSTERED聚簇表,聚簇表是不支持修改