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

MySQL ALTER TABLE 表結構變更完整語法與生產環境避坑指南

     編輯:MySQL 綜合教學

ALTER TABLE 核心語法速查

ALTER [IGNORE] TABLE tbl_name
  [ADD [COLUMN] col_def [FIRST | AFTER col_name]]
  [ADD INDEX [idx_name] (col_list)]
  [ADD PRIMARY KEY (col_list)]
  [ADD UNIQUE [idx_name] (col_list)]
  [ADD FOREIGN KEY ...]          -- 僅語法兼容,InnoDB 實際生效
  [ALTER [COLUMN] col_name {SET DEFAULT val | DROP DEFAULT}]
  [CHANGE [COLUMN] old_col_name new_col_def]
  [MODIFY [COLUMN] col_def]
  [DROP [COLUMN] col_name]
  [DROP PRIMARY KEY]
  [DROP INDEX idx_name]
  [RENAME [AS] new_tbl_name]
  [table_options];

常見操作實戰範例

需求SQL 範例注意事項
新增列(指定位置)ALTER TABLE t ADD col INT AFTER id;大表建議 AFTER 避免首列移動
修改列類型/屬性ALTER TABLE t MODIFY col BIGINT NOT NULL;收縮長度需確保現有數據不截斷
重命名列ALTER TABLE t CHANGE old_name new_name VARCHAR(50);需完整重述列定義
新增主鍵ALTER TABLE t ADD PRIMARY KEY (id);列必須 NOT NULL 且唯一
新增自增列ALTER TABLE t ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY;自增列必須為索引鍵一部分
刪除列ALTER TABLE t DROP COLUMN col;組合索引中列被刪,索引自動調整
重命名表RENAME TABLE old_t TO new_t;原子操作,無需鎖表,推薦用此語法

InnoDB Online DDL 機制 (5.6+)

  • INPLACE:原地重建,僅元數據鎖,允許並發 DML(大多數操作)
  • COPY:拷貝重建表,全程獨佔鎖(舊版預設、含 FOREIGN KEY 變更、列類型收縮等)
  • 指定算法:ALTER TABLE t ADD INDEX idx_c (c), ALGORITHM=INPLACE, LOCK=NONE;
  • 鎖模式:LOCK=NONE(無鎖)、SHARED(共享鎖)、DEFAULT、EXCLUSIVE(獨佔)

生產環境變更檢查清單

  1. 評估影響:表大小、索引大小、業務高峰期、主從延遲風險
  2. 備份驗證:變更前全量備份,或使用 pt-online-schema-change / gh-ost 無鎖變更
  3. 主庫執行:主庫執行 DDL,從庫異步複寫(注意長時間 DDL 導致主從延遲)
  4. 監控指標:SHOW PROCESSLIST 觀察 copy to tmp table、磁碟 I/O、主從 Seconds_Behind_Master
  5. 回滾預案:準備逆向 DDL,驗證數據兼容性

隱式類型轉換陷阱

MySQL 會在某些情況下忽略請求的類型變更:

  • VARCHAR → CHAR:表有其他變長列時自動保持 VARCHAR
  • 數值類型擴展:INT → BIGINT 允許,BIGINT → INT 需確保數值範圍
  • 使用 DESCRIBE 或 SHOW CREATE TABLE 驗證實際生效結構
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved