首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 主鍵類型變更實戰:INT 自增主鍵平滑遷移至 CHAR(18) 完整操作指南

     編輯:MySQL 綜合教學

業務背景與挑戰

現有表主鍵為 INT AUTO_INCREMENT,因業務整合需遷移至 CHAR(18)(如統一採用雪花算法 ID)。約束條件:表含海量歷史數據,不可刪表重建,必須在線 DDL 變更。

四步安全變更流程

-- 步驟 1:移除 AUTO_INCREMENT 屬性(保留 INT 類型)
ALTER TABLE `table_name` CHANGE `indexid` `indexid` INT;

-- 步驟 2:刪除主鍵約束(此操作會短暫鎖表,建議低峰期執行)
ALTER TABLE `table_name` DROP PRIMARY KEY;

-- 步驟 3:修改欄位類型為 CHAR(18)(含數據轉換,耗時與表大小成正比)
ALTER TABLE `table_name` CHANGE `indexid` `indexid` CHAR(18);

-- 步驟 4:重新添加主鍵約束
ALTER TABLE `table_name` ADD PRIMARY KEY (`indexid`);

關鍵風險點與應對策略

風險點影響應對方案
步驟 2 刪除 PK 期間寫入失敗業務報錯維護窗口執行;或使用 pt-online-schema-change / gh-ost 在線變更工具
INT→CHAR 數據轉換邏輯數值 123 → '123' 左對齊,長度不足不補零預先驗證轉換邏輯;若需固定長度,應用層生成 ID 時左補零
外鍵關聯表級聯失效關聯表外鍵報錯先刪除所有關聯外鍵,變更完成後重建
索引重建耗時與空間臨時佔用 1-2 倍表空間確保磁盤剩餘空間 > 3 倍表大小;監控 SHOW PROCESSLIST

生產環境推薦:在線 Schema 變更工具

# 使用 gh-ost (GitHub 出品,無觸發器、無鎖表)
gh-ost \
  --host=127.0.0.1 --port=3306 --user=root --password=xxx \
  --database=db_name --table=table_name \
  --alter="CHANGE COLUMN indexid indexid CHAR(18), DROP PRIMARY KEY, ADD PRIMARY KEY(indexid)" \
  --execute --max-load=Threads_running=50 --critical-load=Threads_running=100

# 或 pt-online-schema-change (Percona Toolkit)
pt-online-schema-change \
  --alter="CHANGE COLUMN indexid indexid CHAR(18), DROP PRIMARY KEY, ADD PRIMARY KEY(indexid)" \
  D=db_name,t=table_name --execute --max-load=Threads_running=50

驗證清單

  1. SHOW CREATE TABLE table_name 確認結構正確
  2. SELECT indexid FROM table_name LIMIT 10 抽樣檢查數據格式
  3. INSERT INTO table_name (indexid, ...) VALUES ('test_id_001', ...) 驗證寫入
  4. EXPLAIN SELECT * FROM table_name WHERE indexid = 'xxx' 確認索引生效
  5. 檢查關聯表外鍵約束狀態

核心原則: 任何主鍵類型變更都是高風險操作,必須經過測試環境全流程驗證、制定回滾預案、在低峰期配合在線變更工具執行。MySQL 8.0+ 支援 INSTANT DDL 部分場景秒級完成,升級版本亦為長遠之計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved