嘗試對現有表的欄位加 `AUTO_INCREMENT` 時,常遇到 **Error 1075 (ER_WRONG_AUTO_KEY): Incorrect table definition; there can be only one auto column and it must be defined as a key** 。本文解析錯誤原因,給出標準解法與變體方案。
CREATE TABLE people (
peopleid SMALLINT NOT NULL,
name CHAR(50) NOT NULL
);
-- 直接嘗試加自增
ALTER TABLE people CHANGE peopleid peopleid SMALLINT AUTO_INCREMENT;
-- ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
MySQL 規定:`AUTO_INCREMENT` 欄位**必須被索引** (通常是主鍵或唯一索引的第一列)。單獨修改類型加 `AUTO_INCREMENT` 而不建立索引,違反此規則。
-- 步驟 1:將欄位設為主鍵 (隱含建立索引)
ALTER TABLE people ADD PRIMARY KEY (peopleid);
-- 步驟 2:修改欄位加上 AUTO_INCREMENT
ALTER TABLE people CHANGE peopleid peopleid SMALLINT AUTO_INCREMENT;
**關鍵點**:`CHANGE`/`MODIFY` 時**必須完整聲明類型** (`SMALLINT`),否則會報錯或類型被重置。
-- 若表已有主鍵,或業務不想用此列做主鍵
ALTER TABLE people CHANGE peopleid peopleid SMALLINT AUTO_INCREMENT UNIQUE;
此語句同時建立 **唯一索引** 並設定自增,滿足「自增列必須是鍵」的要求。但注意:
-- 1. 移除舊主鍵/自增屬性 (若有)
ALTER TABLE people DROP PRIMARY KEY;
ALTER TABLE people MODIFY peopleid SMALLINT NOT NULL; -- 移除 AUTO_INCREMENT
-- 2. 重新編號 (業務邏輯決定)
UPDATE people SET peopleid = 0; -- 歸零
-- 或按 name 排序重新編號
SET @rownum = 0;
UPDATE people SET peopleid = (@rownum := @rownum + 1) ORDER BY name;
-- 3. 重新加主鍵 + 自增
ALTER TABLE people ADD PRIMARY KEY (peopleid);
ALTER TABLE people MODIFY peopleid SMALLINT AUTO_INCREMENT;
-- 4. 設定自增起始值 (可選)
ALTER TABLE people AUTO_INCREMENT = 1000;
| 誤區操作 | 結果 | 正確做法 |
|---|---|---|
| `ALTER TABLE people MODIFY peopleid AUTO_INCREMENT;` (不寫類型) | 類型被重置為預設 `INT`,或報語法錯 | **完整聲明類型**:`MODIFY peopleid SMALLINT AUTO_INCREMENT` |
| 表已有主鍵,又想讓另一列自增 | 報 1075 (只能有一個自增列) | 移除舊主鍵自增屬性,或用觸發器/應用層生成序號 |
| 用 `REPLACE INTO`/`INSERT IGNORE` 期望自增填補 | 自增值仍會遞增 (燒 ID),不會回填空洞 | 接受自增 ID 不連續、或用應用層邏輯管理 |
| 分區表加自增 | 分區鍵必須包含自增列,限制極多 | 避免分區表用自增,改用 UUID/雪花算法 |