MySQL ALTER TABLE ADD COLUMN 指定位置:FIRST 與 AFTER 實戰語法
MySQL 支援在 ALTER TABLE ... ADD COLUMN 時指定新欄位位置,這在調整表結構、保持邏輯欄序對齊時非常有用。本文說明語法、範例與注意事項。
語法
ALTER TABLE `table_name`
ADD [COLUMN] `col_name` `column_definition`
[FIRST | AFTER `existing_col_name`];
關鍵字說明
FIRST:新欄位插入為**第一欄**
AFTER `col_name`:新欄位插入在指定現有欄位**之後**
- ❌ **不支援
BEFORE`**,若要插在某欄位前,只能用 AFTER` 該欄位的前一欄,或重建表。
實戰範例
-- 原表結構
CREATE TABLE `test` (
`a` INT(11) NOT NULL,
`b` VARCHAR(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 1. 在欄位 a 之後新增欄位 c
ALTER TABLE `test` ADD COLUMN `c` INT NOT NULL AFTER `a`;
-- 新結構:a, c, b
-- 2. 在第一欄新增自增主鍵 id
ALTER TABLE `test` ADD COLUMN `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
-- 新結構:id, a, c, b
驗證欄位順序
DESC `test`;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| a | int(11) | NO | | NULL | |
| c | int(11) | NO | | NULL | |
| b | varchar(200) | NO | | NULL | |
+-------+------------------+------+-----+---------+----------------+
注意事項與避坑
| 場景 | 影響 | 建議 |
| 大表加欄位指定位置 | MySQL 5.6+ 支援 Online DDL,但指定位置**強制重建表**(COPY 算法),會鎖表、佔用臨時空間 | 大表優先 AFTER` 最後一欄`(INPLACE 算法,無鎖),或使用 pt-online-schema-change |
| 加入 NOT NULL 無預設值 | 表有資料時會報錯 | 加 DEFAULT 值 或先加 NULL 後再 MODIFY NOT NULL |
| 自增主鍵加 FIRST | 會重新排列所有行的物理順序 | 確認業務不依賴物理行序(通常不依賴) |
| 外鍵/觸發器/視圖依賴 | 重建表可能導致失效 | 先刪除依賴物件,變更後重建 |
對比:其他資料庫支援度
| 資料庫 | 支援指定位置 | 語法 |
| MySQL | ✅ | FIRST | AFTER col |
| PostgreSQL | ❌ | 僅能加在最後,調整須重建表 |
| SQL Server | ❌ | 僅能加在最後 |
| Oracle | ❌ | 12c+ 支援 INVISIBLE 欄位,但無順序調整 |
| SQLite | ❌ | 僅能加在最後 |