萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 匯入報錯 Duplicate entry for key:原因分析與三種解決方案

錯誤現象

ERROR 1062 (23000) at line 1262: Duplicate entry '...' for key 2

導入中斷,或加 --force 強制繼續但產生大量同類錯誤。

根本原因分析

  1. 主鍵/唯一鍵值真正重複:匯出檔案本身含重複資料。
  2. 字元集不匹配導致「視覺上不同、實際相同」:匯出時 UTF-8,匯入時被當作 latin1/gbk 解析,多位元組字元被誤切分,產生相同的鍵值。
  3. 複合主鍵/唯一索引定義不全:表定義了複合唯一索引,但匯入時索引未正確重建,導致部分欄位未參與唯一性檢查。

解決方案

方案一:指定正確字元集匯入(最常見有效)

mysql -u root -p db_name --default-character-set=utf8 < dump.sql
# 或在 SQL 檔頭部加入
SET NAMES utf8;

確保匯入會話字元集與匯出檔案編碼一致。

方案二:使用 REPLACE/IGNORE 跳過或覆蓋衝突行

# 覆蓋現有記錄
mysql -u root -p db_name --force < dump.sql  # 不推薦,會掩蓋資料問題

# 修改 dump.sql 中的 INSERT 為 REPLACE/IGNORE
# 或使用 LOAD DATA INFILE REPLACE/IGNORE

方案三:檢查並修正索引定義

若表有複合主鍵 (id1, id2) 但索引只建在 id1,插入 (1,2) 後再插 (1,3) 會報錯。
解決:ALTER TABLE tbl ADD UNIQUE INDEX idx_id1_id2 (id1, id2); 補全組合索引。

最佳實踐建議

  1. 匯出時明確指定字元集:mysqldump --default-character-set=utf8 ...
  2. 匯入前檢查目標表結構、索引與來源一致
  3. 大量匯入前先在測試環境驗證
  4. 使用 pt-table-checksum 或 pt-table-sync (Percona Toolkit) 驗證主從/備份一致性
copyright © 萬盛學電腦網 all rights reserved