文章目录
1、背景
在某种情况下,创建了一个表,并且使用 联合索引 作为表的主键,然后在实际测试中发现,联合主键设置不当,某些正常的数据也无法插入,所以需要对联合主键进行修改。
2、过程记录
2.1、修改索引的方法
Mysql 并没有提供修改索引设置的方法,所以只能先删除索引,再创建索引。
# 主键索引-先删除,再重建
ALTER TABLE 表名 DROP primary key, ADD primary key(字段1,字段2);
# 普通索引-先删除,再重建-唯一索引
ALTER TABLE 表名 DROP INDEX 索引名;
ALTER TABLE 表名 ADD UNIQUE KEY 索引名(字段1,字段2);
2.2、出问题了:FATAL No shared unique key can be found after ALTER! Bailing out
在执行删除主键的过程中,报错了,查了一下资料发现是目前表除了主键索引,没有其他的唯一索引,这样会导致主键被删除之后,在新主键被创建之前,这段时间表是没有唯一索引的——可能会插入脏数据,删除索引和创建索引都是需要时间的。
2.3、解决办法:创建临时 唯一索引
在 2.2 中提到问题愿意是,若删除主键索引,表必须先存在 唯一索引,所以我们可以采取先创建唯一索引的方法,这里需要注意一个问题,本文创建的唯一索引是联合索引,遇到了另一个问题,即联合索引字段不许非空,但是默认建表时没有限定这个条件,所以还需要先满足相关属性非空的表DDL 限定。
3、反思
事中和小伙伴一起看了这个问题,然后参考了一下业内的规范,得出下面的结论。
3.1、主键 id 是必须的
由于业务场景的缘故,此表日增量很小,但是需要保证数据唯一性,开始直接将联合索引作为主键,其实这样的危害不单单在修改联合索引时遇到问题,将来一旦数据量大到需要分库分表的程度,就很难处理了。
3.2、联合索引的修改
先删除再创建,参考 2.1
4、建表规范
根据《阿里巴巴Java 开发手册》
主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名。
说明:pk_ 即 primary key;uk_ 即 unique key;idx_ 即 index 的简称。
建表时创建主键索引
id bigint auto_increment primary key,
建表时创建联合索引
constraint uk_字段1_字段2 unique (字段1, 字段2)
自动获取时间
create_time datetime default CURRENT_TIMESTAMP null comment '插入日期',
参考资料
[1]、https://blog.csdn.net/weixin_41863129/article/details/104468990