基本語法結構
ALTER [IGNORE] TABLE tbl_name
alter_spec [, alter_spec ...]
alter_spec:
ADD [COLUMN] col_def [FIRST | AFTER col_name]
| ADD INDEX [idx_name] (col_name,...)
| ADD PRIMARY KEY (col_name,...)
| ADD UNIQUE [idx_name] (col_name,...)
| ALTER [COLUMN] col_name {SET DEFAULT val | DROP DEFAULT}
| CHANGE [COLUMN] old_col_name new_col_def
| MODIFY [COLUMN] col_def
| DROP [COLUMN] col_name
| DROP PRIMARY KEY
| DROP INDEX idx_name
| RENAME [AS] new_tbl_name
| table_options
欄位操作實例
新增欄位
ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email;
ALTER TABLE users ADD COLUMN age TINYINT UNSIGNED FIRST;
修改欄位名稱與型別
-- CHANGE:可改名、改型別、改屬性(需完整重寫定義)
ALTER TABLE users CHANGE COLUMN phone mobile VARCHAR(20) NOT NULL DEFAULT '';
-- MODIFY:僅改型別/屬性,名稱不變
ALTER TABLE users MODIFY COLUMN mobile CHAR(11) NOT NULL;
刪除欄位
ALTER TABLE users DROP COLUMN age;
修改預設值
ALTER TABLE users ALTER COLUMN status SET DEFAULT 1;
ALTER TABLE users ALTER COLUMN status DROP DEFAULT;
索引操作實例
新增一般索引
ALTER TABLE users ADD INDEX idx_name (name);
ALTER TABLE users ADD INDEX idx_name_email (name, email);
新增主鍵
ALTER TABLE users ADD PRIMARY KEY (id);
-- 複合主鍵
ALTER TABLE orders ADD PRIMARY KEY (order_id, item_id);
新增唯一索引
ALTER TABLE users ADD UNIQUE uk_email (email);
查看索引
SHOW INDEX FROM users;
-- 或
SHOW KEYS FROM users;
刪除索引
ALTER TABLE users DROP INDEX idx_name;
ALTER TABLE users DROP PRIMARY KEY; -- 刪主鍵
表重命名
ALTER TABLE old_name RENAME TO new_name;
-- 或
RENAME TABLE old_name TO new_name;
實戰建議
- 大表
ALTER TABLE 會鎖表(MySQL 5.6+ 支援 Online DDL 部份操作),建議低峰期執行或使用 pt-online-schema-change。
MODIFY 比 CHANGE 更安全(不會誤改欄位名)。
- 刪除欄位前確認無外鍵、視圖、觸發器依賴。
- 新增索引前評估寫入效能影響。