修改表定義比重建表簡單,不影響現有服務。MySQL 通過 ALTER TABLE 支援 8 類核心操作。
ALTER TABLE 舊表名 RENAME [TO] 新表名;
-- TO 可選,不影響執行
演示:
CREATE TABLE `user` (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(5), card_id VARCHAR(20), age INT DEFAULT 25);
ALTER TABLE `user` RENAME `usr`; -- 成功,結構數據無損
ALTER TABLE 表名 MODIFY 欄位名 新資料類型;
演示:ALTER TABLE `user` MODIFY name VARCHAR(10) NOT NULL; 將長度 5 → 10。

ALTER TABLE 表名 CHANGE 舊欄位名 新欄位名 新資料類型;
-- 僅改名時類型保持原樣
兩種情況:
| 場景 | SQL 範例 |
|---|---|
| 僅改名 | |
| 改名+改類型 |


ALTER TABLE 表名 ADD 欄位名 資料類型 [約束] [FIRST | AFTER 既有欄位名];
四種定位方式:
| 需求 | SQL | 位置 |
|---|---|---|
| 末尾新增 | 最後 | |
| 帶約束新增 | 最後 | |
| 插到第一欄 | 最前 | |
| 指定欄位後 | name 後 |




ALTER TABLE 表名 DROP 欄位名;
演示:ALTER TABLE `user` DROP name; 成功移除。

ALTER TABLE 表名 MODIFY 欄位名 資料類型 FIRST | AFTER 既有欄位名;
演示:
ALTER TABLE `user` MODIFY name VARCHAR(5) FIRST; → 移到首位ALTER TABLE `user` MODIFY name VARCHAR(5) AFTER age; → 移到 age 後

工具生成 SQL 對比:客戶端工具常用 CHANGE COLUMN ... AFTER ... 實現同樣效果。

ALTER TABLE 表名 ENGINE = 新引擎名;
演示:ALTER TABLE `user` ENGINE = MyISAM; InnoDB → MyISAM 成功。


⚠️ 警告:大表變更引擎會全表重建、長時間鎖表、IO 飆升,生產環境嚴禁直接執行,請用
pt-online-schema-change或藍綠部署遷移。
ALTER TABLE 子表名 DROP FOREIGN KEY 外鍵別名;
演示:
CREATE TABLE `address` (
id INT PRIMARY KEY,
user_id INT,
FOREIGN KEY (user_id) REFERENCES `user`(id) ON DELETE CASCADE
);
ALTER TABLE `address` DROP FOREIGN KEY user_id; -- 成功移除

MODIFYCHANGEMODIFY ... FIRST/AFTER 或 CHANGE ... FIRST/AFTERThreads_running、Innodb_row_lock_waits、磁碟 IO、Replication Lag