MySQL ALTER TABLE 支援在建表後動態調整欄位順序,透過 FIRST (置首) 或 AFTER col_name (置於指定欄位後) 實現,避免重建表。
ALTER TABLE tbl_name
ADD [COLUMN] col_name column_definition
[FIRST | AFTER col_name];
-- 1. 建立測試表
CREATE TABLE t (
age INT,
address VARCHAR(50)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 2. 查看初始結構
DESC t;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| age | int | YES | | NULL | |
| address | varchar(50) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
-- 3. 在 age 之後新增 name
ALTER TABLE t ADD COLUMN name VARCHAR(20) AFTER age;
DESC t;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| age | int | YES | | NULL | |
| name | varchar(20) | YES | | NULL | | ← 新欄位插在 age 之後
| address | varchar(50) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
-- 4. 在最前面新增 id
ALTER TABLE t ADD COLUMN id INT FIRST;
DESC t;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | | ← 置首
| age | int | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| address | varchar(50) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
pt-online-schema-change。| 資料庫 | 支援指定位置 | 語法/備註 |
|---|---|---|
| MySQL | ✅ 完整支援 | ADD COLUMN col TYPE AFTER col2 / FIRST |
| PostgreSQL | ❌ 不支援 | 新欄位永遠附加在末尾,需重建表調整順序 |
| SQL Server | ❌ 不支援 | 同 PostgreSQL,順序無語義影響 |
| Oracle | ❌ 不支援 | 12c+ 可用 INVISIBLE COLUMNS 變相控制 |
SELECT * 欄位順序,明確列出欄位名稱,避免順序變更導致解析錯誤。