首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL Duplicate Entry 錯誤根因分析:TINYINT 自增主鍵耗盡導致

     編輯:MySQL 資料庫相關知識

遇到 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 範圍不足

型別有號範圍無號範圍
TINYINT-128 ~ 1270 ~ 255
SMALLINT-32,768 ~ 32,7670 ~ 65,535
MEDIUMINT-8,388,608 ~ 8,388,6070 ~ 16,777,215
INT-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,295
BIGINT-9.22E18 ~ 9.22E180 ~ 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 避免未來再次遷移。

四、預防建議

  1. 設計階段根據預估資料量選擇適當整數型別,預設使用 INT UNSIGNED 或 BIGINT UNSIGNED。
  2. 避免使用 TINYINT、SMALLINT 作為自增主鍵,除非確定資料量極小且永不增長。
  3. 定期監控自增值接近上限比例,設定告警機制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved