ALTER TABLE 常用語法速查表
所有操作均為線上 DDL (MySQL 5.6+ 支援 Online DDL),大表執行前請評估鎖影響、預留磁碟空間、低峰期執行。
欄位操作
| 操作 | 語法範例 | 備註 |
| 新增欄位 | ALTER TABLE t ADD col INT NOT NULL DEFAULT 0; | 指定位置用 FIRST / AFTER col2 |
| 刪除欄位 | ALTER TABLE t DROP COLUMN col; | 不可刪除被外鍵/索引引用的欄位 |
| 修改欄位名+類型 | ALTER TABLE t CHANGE old_col new_col BIGINT NOT NULL; | 類型不變也需完整寫出 |
| 僅修改類型 | ALTER TABLE t MODIFY col VARCHAR(100) NOT NULL; | 不支援重命名 |
| 調整欄位順序 | ALTER TABLE t MODIFY col INT FIRST; / AFTER other_col | 僅元數據操作,極快 |
索引與約束管理
| 操作 | 語法範例 | 備註 |
| 新增普通索引 | ALTER TABLE t ADD INDEX idx_name (col1, col2); | 索引名可省略,系統自動生成 |
| 新增唯一索引 | ALTER TABLE t ADD UNIQUE uk_email (email); | 資料有重複會報錯 |
| 新增主鍵 | ALTER TABLE t ADD PRIMARY KEY (id); | 表只能有一個 PK,欄位必須 NOT NULL |
| 刪除索引 | ALTER TABLE t DROP INDEX idx_name; | 主鍵用 DROP PRIMARY KEY |
| 新增外鍵 | ALTER TABLE child ADD CONSTRAINT fk_pid FOREIGN KEY (pid) REFERENCES parent(id); | 高併發慎用,建議應用層維護 |
| 刪除外鍵 | ALTER TABLE child DROP FOREIGN KEY fk_pid; | 需知約束名,可用 SHOW CREATE TABLE 查看 |
表級操作
- 重命名表:
ALTER TABLE old_name RENAME TO new_name; (或 RENAME TABLE old TO new;)
- 變更儲存引擎:
ALTER TABLE t ENGINE=InnoDB; (大表會重建,鎖表久,謹慎操作)
- 修改字元集:
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
進階技巧:自增主鍵重置
-- 重置自增值 (下一條插入從 1000 開始)
ALTER TABLE t AUTO_INCREMENT = 1000;
-- 批次新增帶自增的欄位 (MySQL 8.0.13+ 支援瞬時加欄位)
ALTER TABLE t ADD id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
線上 DDL 影響對照 (InnoDB)
| 操作類型 | 是否複製表 | 是否獨佔鎖 | 備註 |
| 修改欄位類型/長度 | 是 | 僅準備/提交階段短暫鎖 | Online DDL |
| 新增/刪除二級索引 | 否 | 無 | 極快,僅掃描索引頁 |
| 新增/刪除主鍵 | 是 | 短暫鎖 | 涉及聚簇索引重建 |
| 新增/刪除欄位 | 是/否 | 視算法而定 | Instant ADD COLUMN (8.0.12+) 無鎖無拷貝 |
| RENAME TABLE | 否 | 極短元數據鎖 | 首選重命名方式 |