0.2-Mysql学习-联合索引的修改和建表规范

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章