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; | 原子操作,無需鎖表,推薦用此語法 |
ALTER TABLE t ADD INDEX idx_c (c), ALGORITHM=INPLACE, LOCK=NONE;LOCK=NONE(無鎖)、SHARED(共享鎖)、DEFAULT、EXCLUSIVE(獨佔)pt-online-schema-change / gh-ost 無鎖變更SHOW PROCESSLIST 觀察 copy to tmp table、磁碟 I/O、主從 Seconds_Behind_MasterMySQL 會在某些情況下忽略請求的類型變更:
VARCHAR → CHAR:表有其他變長列時自動保持 VARCHAR數值類型擴展:INT → BIGINT 允許,BIGINT → INT 需確保數值範圍DESCRIBE 或 SHOW CREATE TABLE 驗證實際生效結構