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

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