核心語法:ALTER TABLE
ALTER TABLE 表名 操作類型 具體定義;
常用操作分類
1. 新增欄位
-- 末尾新增,允許 NULL
ALTER TABLE user ADD COLUMN new_col VARCHAR(20) DEFAULT NULL;
-- 末尾新增,NOT NULL 需給預設值
ALTER TABLE user ADD COLUMN new_col2 VARCHAR(20) NOT NULL DEFAULT '';
-- 指定位置新增(FIRST / AFTER col_name)
ALTER TABLE user ADD COLUMN new_col3 INT FIRST;
ALTER TABLE user ADD COLUMN new_col4 INT AFTER username;
2. 刪除欄位
ALTER TABLE user DROP COLUMN new_col2;
3. 修改欄位定義(型別、長度、預設值、註解)
-- MODIFY:只改定義,不改名
ALTER TABLE user MODIFY COLUMN name VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用戶名';
-- CHANGE:改名 + 改定義(舊名 新名 定義)
ALTER TABLE user CHANGE COLUMN name username VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用戶名';
4. 重命名表
ALTER TABLE old_name RENAME TO new_name;
-- 或
RENAME TABLE old_name TO new_name;
5. 索引操作
-- 普通索引
ALTER TABLE user ADD INDEX idx_email (email);
ALTER TABLE user ADD INDEX idx_name_age (name, age);
-- 唯一索引
ALTER TABLE user ADD UNIQUE INDEX uk_email (email);
-- 主鍵
ALTER TABLE user ADD PRIMARY KEY (id);
-- 或建表時指定:id INT PRIMARY KEY AUTO_INCREMENT
-- 全文索引
ALTER TABLE articles ADD FULLTEXT INDEX ft_title_body (title, body);
-- 刪除索引
ALTER TABLE user DROP INDEX idx_email;
-- 主鍵刪除
ALTER TABLE user DROP PRIMARY KEY;
6. 外鍵操作
-- 新增
ALTER TABLE orders ADD CONSTRAINT fk_orders_user
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
-- 刪除
ALTER TABLE orders DROP FOREIGN KEY fk_orders_user;
7. 修改表選項
-- 修改引擎
ALTER TABLE user ENGINE = InnoDB;
-- 修改字元集(僅影響新欄位,舊欄位需 CONVERT TO)
ALTER TABLE user CHARSET = utf8mb4;
-- 全表轉換(含資料重新編碼)
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 修改自增起始值
ALTER TABLE user AUTO_INCREMENT = 10000;
實戰範例:批次修改多個欄位
ALTER TABLE products
CHANGE COLUMN `desc` `description` TEXT COMMENT '商品描述',
MODIFY COLUMN price DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '價格',
ADD COLUMN `status` TINYINT NOT NULL DEFAULT 1 COMMENT '狀態' AFTER price,
ADD INDEX idx_status (`status`),
DROP COLUMN old_field;
關鍵注意事項
| 項目 | 說明 |
| 鎖表行為 | MySQL 5.6+ 線上 DDL (Online DDL) 多數操作不鎖表或短暫鎖,但 CHANGE COLUMN、MODIFY COLUMN 可能仍需重建表 |
| 大表修改 | 百萬行以上建議用 pt-online-schema-change 或 gh-ost 零停機變更 |
| 資料截斷 | 縮短 VARCHAR 長度或改更小型別前,先檢查現有資料長度 |
| 外鍵依賴 | 修改被引用欄位需先刪除外鍵 |
| 權限 | 需 ALTER、CREATE、INSERT 權限 |
查看表結構驗證
SHOW CREATE TABLE user\G
DESC user;
SHOW INDEX FROM user;