Error: Duplicate entry '8181' for key 1
Errno: 1062
乍看是主鍵衝突,實則可能是 TINYINT/SMALLINT 自增 ID 達到類型上限。
| 類型 | 有號上限 | 無號上限 |
|---|---|---|
| TINYINT | 127 | 255 |
| SMALLINT | 32,767 | 65,535 |
| MEDIUMINT | 8,388,607 | 16,777,215 |
| INT | 2,147,483,647 | 4,294,967,295 |
| BIGINT | 9.22E18 | 1.84E19 |
Discuz! 早期版本使用 SMALLINT(6) UNSIGNED 作為 tid(主題 ID),上限 65,535。當主題數超過此值,自增嘗試寫入 65,536 失敗,MySQL 回報 Duplicate entry '65535' for key 1(實為溢位截斷回 65535 導致主鍵衝突)。
ALTER TABLE `cdb_threads`
CHANGE `tid` `tid` INT(10) UNSIGNED NOT NULL DEFAULT '0' AUTO_INCREMENT;
cdb_posts.tid 等)。DROP PRIMARY KEY 再 ADD PRIMARY KEY,或用 MODIFY COLUMN(8.0+ 支援)。SELECT
TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_TYPE,
CASE
WHEN DATA_TYPE='tinyint' THEN IF(COLUMN_TYPE LIKE '%unsigned%', 255, 127)
WHEN DATA_TYPE='smallint' THEN IF(COLUMN_TYPE LIKE '%unsigned%', 65535, 32767)
WHEN DATA_TYPE='mediumint' THEN IF(COLUMN_TYPE LIKE '%unsigned%', 16777215, 8388607)
WHEN DATA_TYPE='int' THEN IF(COLUMN_TYPE LIKE '%unsigned%', 4294967295, 2147483647)
WHEN DATA_TYPE='bigint' THEN '~9E18'
END AS max_value,
AUTO_INCREMENT
FROM information_schema.COLUMNS
JOIN information_schema.TABLES USING (TABLE_SCHEMA, TABLE_NAME)
WHERE TABLE_SCHEMA = 'your_db'
AND EXTRA = 'auto_increment'
ORDER BY max_value ASC;
定期執行,提前發現即將耗盡的自增欄位。