ALTER TABLE 是結構變更的核心命令,涵蓋欄位、索引、約束、引擎、分區、重命名等所有 DDL 操作。本文系統整理語法變體、線上/離線特性、效能影響與生產環境避坑清單。
-- 新增欄位(預設加在最後) ALTER TABLE t ADD COLUMN `nickname` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '暱稱'; -- 指定位置 ALTER TABLE t ADD COLUMN `status` TINYINT NOT NULL DEFAULT 1 AFTER `name`; ALTER TABLE t ADD COLUMN `sort` INT NOT NULL DEFAULT 0 FIRST; -- 修改欄位定義(型別、長度、預設值、註解、NOT NULL) ALTER TABLE t MODIFY COLUMN `nickname` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '暱稱'; -- 同時修改名稱與定義 ALTER TABLE t CHANGE COLUMN `nickname` `alias` VARCHAR(100) NOT NULL DEFAULT ''; -- 刪除欄位 ALTER TABLE t DROP COLUMN `alias`; -- 修改預設值 ALTER TABLE t ALTER COLUMN `status` SET DEFAULT 0; ALTER TABLE t ALTER COLUMN `status` DROP DEFAULT;
-- 新增索引
ALTER TABLE t ADD INDEX idx_status (status);
ALTER TABLE t ADD UNIQUE INDEX uk_email (email);
ALTER TABLE t ADD PRIMARY KEY (id); -- 欄位必須 NOT NULL
ALTER TABLE t ADD FULLTEXT INDEX ft_content (content);
-- 刪除索引
ALTER TABLE t DROP INDEX idx_status;
ALTER TABLE t DROP PRIMARY KEY; -- 主鍵無名稱,直接 DROP PRIMARY KEY
-- 外鍵(InnoDB)
ALTER TABLE orders ADD CONSTRAINT fk_orders_cust
FOREIGN KEY (cust_id) REFERENCES customers(id)
ON DELETE RESTRICT ON UPDATE CASCADE;
ALTER TABLE orders DROP FOREIGN KEY fk_orders_cust;
-- 重命名表 ALTER TABLE t RENAME TO t_new; -- 或 RENAME TABLE t TO t_new, t2 TO t2_new; -- 原子性多表重命名 -- 轉換儲存引擎 ALTER TABLE t ENGINE = InnoDB; -- 轉換字符集與排序規則 ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 僅修改表預設字符集(不轉換現有欄位) ALTER TABLE t DEFAULT CHARACTER SET utf8mb4; -- 表選項調整 ALTER TABLE t AUTO_INCREMENT = 10000; ALTER TABLE t COMMENT = '訂單主表'; ALTER TABLE t ROW_FORMAT = DYNAMIC; -- 壓縮/動態行格式
| 操作 | ALGORITHM | 鎖模式 | 說明 |
|---|---|---|---|
| 新增/刪除二級索引 | INPLACE | 無鎖 / 短暫 MDL | 5.6+ 秒級完成,大表也安全 |
| 修改欄位型別/長度 | COPY | 排他鎖 | 需重建表,大表慎用 |
| 新增/刪除欄位 | INPLACE (5.6+) | 短暫 MDL | 僅修改元數據,極快 |
| 轉換引擎/字符集 | COPY | 排他鎖 | 全表重建 |
| 調整 AUTO_INCREMENT | INPLACE | 無鎖 | 元數據操作 |
| 錯誤 | 原因 | 解決 |
|---|---|---|
ERROR 1025 (HY000): Error on rename | 外鍵引用、觸發器、分區表限制 | 先刪除外鍵/觸發器,或用 pt-osc |
ERROR 1846 (0A000): ALGORITHM=INPLACE not supported | 操作不支援 INPLACE(如修改型別) | 移除 ALGORITHM=INPLACE 或用 pt-osc |
LOCK WAIT TIMEOUT | MDL 被長事務阻塞 | Kill 長事務、低峰執行、設定 lock_wait_timeout |
熟練掌握 ALTER TABLE 的各種變體與線上特性,是 DBA 與開發者安全演進資料庫結構的基本功。