遇到 Invalid Query : Duplicate entry '127' for key 1 或 Duplicate entry '32767' for key 1 錯誤時,多半是自增主鍵資料型別範圍耗盡所致。本文透過實際案例解析根因與解決方案。
CREATE TABLE IF NOT EXISTS `kq_news` (
`Id` tinyint(3) NOT NULL AUTO_INCREMENT,
`Title` varchar(90) NOT NULL,
`Content` text NOT NULL,
`Adate` date NOT NULL,
`IsDel` tinyint(1) NOT NULL DEFAULT '0',
`Hits` int(5) NOT NULL DEFAULT '0',
`Author` varchar(20) NOT NULL,
`Type` tinyint(1) NOT NULL DEFAULT '1',
`Lang` varchar(2) NOT NULL,
`Range` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
錯誤發生於 Id=127 時,嘗試 REPAIR TABLE、myisamchk 均無效。
| 型別 | 有號範圍 | 無號範圍 |
|---|---|---|
| TINYINT | -128 ~ 127 | 0 ~ 255 |
| SMALLINT | -32,768 ~ 32,767 | 0 ~ 65,535 |
| MEDIUMINT | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 |
| INT | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 |
| BIGINT | -9.22E18 ~ 9.22E18 | 0 ~ 1.84E19 |
TINYINT(3) 有號最大值 127,插入第 128 筆資料時自增值溢位回繞導致重複鍵衝突。
-- 方案一:修改為 BIGINT(推薦,一勞永逸)
ALTER TABLE kq_news MODIFY COLUMN Id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT;
-- 方案二:修改為 INT(足夠大多數應用)
ALTER TABLE kq_news MODIFY COLUMN Id INT UNSIGNED NOT NULL AUTO_INCREMENT;
修改後自增計數器自動重置,後續插入恢復正常。若資料量極大,建議直接使用 BIGINT 避免未來再次遷移。
INT UNSIGNED 或 BIGINT UNSIGNED。TINYINT、SMALLINT 作為自增主鍵,除非確定資料量極小且永不增長。