ALTER TABLE 是 MySQL 中修改現有資料表結構的核心指令。無論是新增欄位、調整順序、變更型別、管理索引,還是重命名表,都透過此指令完成。本文以實戰範例為主,系統整理常見操作語法與注意事項。
-- 基本新增(預設加在最後)
ALTER TABLE user_movement_log ADD COLUMN GatewayId INT NOT NULL DEFAULT 0;
-- 指定位置:AFTER 現有欄位 / FIRST 加在最前
ALTER TABLE user_movement_log ADD COLUMN GatewayId INT NOT NULL DEFAULT 0 AFTER RegionId;
ALTER TABLE new_table ADD COLUMN id INT PRIMARY KEY FIRST;
ALTER TABLE user_movement_log DROP COLUMN GatewayId;
⚠️ 刪除欄位會同步移除該欄位相關的索引與約束,資料永久遺失,操作前請備份。
-- MODIFY:只變更型別/屬性,欄位名不變
ALTER TABLE t1 MODIFY COLUMN b BIGINT NOT NULL;
ALTER TABLE infos MODIFY COLUMN list TINYINT NOT NULL DEFAULT 0;
-- CHANGE:可同時變更欄位名與定義(需寫兩次欄位名)
ALTER TABLE t1 CHANGE COLUMN a b INTEGER;
ALTER TABLE infos CHANGE COLUMN list list TINYINT NOT NULL DEFAULT 0;
MySQL 不支援直接「移動欄位」,需透過 CHANGE ... AFTER 重新定義:
ALTER TABLE user_movement_log
CHANGE COLUMN GatewayId GatewayId INT NOT NULL DEFAULT 0 AFTER RegionId;
ALTER TABLE table_name
ADD new_field_id INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (new_field_id);
-- 普通索引
ALTER TABLE tablename ADD INDEX idx_name (column_name);
ALTER TABLE tablename ADD INDEX idx_multi (col1, col2);
-- 唯一索引
ALTER TABLE tablename ADD UNIQUE uk_card (cardnumber);
-- 主鍵索引
ALTER TABLE tablename ADD PRIMARY KEY (id);
-- 刪除索引
ALTER TABLE tablename DROP INDEX idx_name;
ALTER TABLE t1 RENAME TO t2;
ALTER TABLE t1 ENGINE = InnoDB;
ALTER TABLE users
ADD COLUMN phone VARCHAR(20) AFTER email,
MODIFY COLUMN name VARCHAR(100) NOT NULL,
DROP COLUMN deprecated_col,
ADD INDEX idx_phone (phone),
ADD UNIQUE uk_email (email);
✅ 建議:生產環境盡量合併操作,減少鎖表時間與資料複製開銷。
| 情境 | 說明 |
|---|---|
| 大表 ALTER TABLE | MySQL 5.6+ 支援 Online DDL,但部分操作仍需鎖表、複製資料。大表建議用 pt-online-schema-change 或 gh-ost |
| 修改 ENUM/SET 值 | 新增值安全,刪除/重排現有值會導致資料截斷或錯誤 |
| 外鍵欄位變更 | 需先刪除外鍵約束,修改完再建立 |
| AUTO_INCREMENT 重設 | ALTER TABLE t AUTO_INCREMENT = N 僅影響下一筆插入,不重排現有值 |
| 字元集變更 | ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 會轉換資料,DEFAULT CHARSET 僅影響新欄位 |
-- 查看表結構
SHOW CREATE TABLE table_name;
DESCRIBE table_name;
SHOW COLUMNS FROM table_name;
-- 查看索引
SHOW INDEX FROM table_name;
ALTER TABLE 功能強大但風險並存。掌握語法細節、理解底層鎖表行為、善用批次操作與線上變更工具,才能在生產環境安全、高效地演進資料庫結構。