業務常遇場景:表已建立、資料已入庫,後來決定某欄位 (如 userid) 改為自增主鍵。MySQL 支援單條 ALTER TABLE ... CHANGE 完成「修改類型+設自增+設主鍵」原子操作。
ALTER TABLE `user`
CHANGE `userid` `userid` INT NOT NULL AUTO_INCREMENT PRIMARY KEY;
CREATE TABLE `user` (
`username` VARCHAR(20) NOT NULL,
`pw` VARCHAR(20) NOT NULL,
`userid` INT(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `user`
CHANGE `userid` `userid` INT NOT NULL AUTO_INCREMENT PRIMARY KEY;
效果: userid 成為主鍵、非空、自增,現有資料保留,新插入自動分配遞增 ID。
CREATE TABLE `user` (
`username` VARCHAR(20) NOT NULL,
`pw` VARCHAR(20) NOT NULL,
`userid` INT(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
| 操作 | 語句範例 | 關鍵點 |
|---|---|---|
| 新增欄位並設主鍵 | ALTER TABLE t ADD new_id INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (new_id); | 新欄位必須 NOT NULL、整數類型 |
| 新增主鍵索引 | ALTER TABLE t ADD PRIMARY KEY (id); | 欄位需非空唯一 |
| 新增普通索引 | ALTER TABLE t ADD INDEX idx_name (name); | 支援多欄位 (col1,col2) |
| 新增唯一索引 | ALTER TABLE t ADD UNIQUE uk_card (card_no); | 值唯一、允許多 NULL |
| 刪除索引 | ALTER TABLE t DROP INDEX idx_name; | 需知索引名 (非欄位名) |
| 新增欄位 | ALTER TABLE t ADD col_name col_type; | 預設末尾,可 FIRST/AFTER col |
| 刪除欄位 | ALTER TABLE t DROP col_name; | 同步刪除相關索引/約束 |
| 重命名欄位 | ALTER TABLE t CHANGE old_name new_name col_type; | 必須給完整類型定義 |
| 調整欄位順序 | ALTER TABLE users CHANGE user_pwd user_pwd VARCHAR(20) NOT NULL AFTER user_name; | 同 CHANGE 語法 |
| 修改欄位類型 | ALTER TABLE t CHANGE col col BIGINT NOT NULL; | 數據截斷風險,先評估 |
| 修改欄位名+類型 | ALTER TABLE t CHANGE old_name new_name new_type; | 同上 |
| 重命名表 | ALTER TABLE t RENAME new_t; | 或 RENAME TABLE t TO new_t; |
| 外鍵級聯 | FOREIGN KEY (rid) REFERENCES parent(id) ON DELETE CASCADE ON UPDATE CASCADE | InnoDB 支援,MyISAM 忽略 |
Duplicate entry / Column cannot be null。ALTER TABLE t AUTO_INCREMENT = 1000;。CHANGE ... AUTO_INCREMENT PRIMARY KEY 仍需重建表 (複製數據),大表建議 pt-online-schema-change。-- 1. 確認結構
SHOW CREATE TABLE `user`;
-- 2. 確認自增值
SHOW TABLE STATUS LIKE 'user'\G
-- 關注 Auto_increment 值
-- 3. 測試插入
INSERT INTO `user` (`username`,`pw`) VALUES ('test','pass');
SELECT * FROM `user` ORDER BY `userid` DESC LIMIT 3;
掌握 CHANGE ... AUTO_INCREMENT PRIMARY KEY 單條語句原子化變更,配合大表線上變更工具,讓結構演進安全、高效、無感知。