基本語法結構
ALTER TABLE `tbl_name`
ADD [COLUMN] `col_name` column_definition
[FIRST | AFTER `existing_col`];
三大常用變體
| 場景 | SQL 範例 | 說明 |
| 單純新增 (預設放末尾) | ALTER TABLE `user` ADD `age` TINYINT UNSIGNED; | 允許 NULL、無預設值 |
| 新增帶預設值 + NOT NULL | ALTER TABLE `user` ADD `status` TINYINT NOT NULL DEFAULT 1; | 既有資料自動填 1,未來插入必填 |
| 指定位置 (在 email 後) | ALTER TABLE `user` ADD `phone` VARCHAR(20) AFTER `email`; | 邏輯順序調整,不影響資料 |
進階屬性一次加齊
ALTER TABLE `orders`
ADD `discount` DECIMAL(5,2) NOT NULL DEFAULT 0.00
COMMENT '折扣比例 0.00~1.00'
AFTER `total_amount`;
MySQL 8.0+ Instant ADD COLUMN
- 條件:僅限末尾新增、無預設值或預設常數、非主鍵/分區鍵、非外鍵參照欄。
- 效果:純元資料操作,不重建表、不鎖表、毫秒級完成,無論表多大。
- 驗證:
SHOW CREATE TABLE 觀察 /* IMPORT */ 註釋或 INFORMATION_SCHEMA.INNODB_TABLES 版本號跳躍。
驗證與回滾
-- 檢查欄位定義
SHOW COLUMNS FROM `user` LIKE 'phone';
-- 刪除剛加的欄位 (謹慎)
ALTER TABLE `user` DROP `phone`;
避坑提醒
- 大表加
NOT NULL 無 DEFAULT → 報錯,必須給預設值或先允許 NULL。
- 外鍵欄位型別、長度、UNSIGNED 必須與父表主鍵完全一致。
COMMENT 字串長度上限 1024 字元,需用單引號。
- 分區表新增欄位可能觸發全表重建,評估維護窗口。