首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MySQL 僅保存一條數據且不斷覆蓋:主鍵衝突與 REPLACE/INSERT 用法辨析

     編輯:程式設計疑難解答

典型現場

  • 表結構有主鍵或唯一索引(如 id INT PRIMARY KEY)。
  • 代碼反覆執行 INSERT INTO t (id, col) VALUES (1, 'xxx')。
  • 報錯 Duplicate entry '1' for key 'PRIMARY',或使用了 REPLACE INTO / INSERT ... ON DUPLICATE KEY UPDATE 導致覆蓋。

根因

主鍵值固定不變,每次插入同一主鍵,MySQL 必須拋錯或更新現有行。

解決方案

  1. 自增主鍵:建表時 id INT AUTO_INCREMENT PRIMARY KEY,插入時不指定 id,MySQL 自動分配遞增值。
    INSERT INTO t (col) VALUES ('xxx')
  2. 業務主鍵 + 忽略衝突:若業務鍵(如訂單號)不可重複,用 INSERT IGNORE INTO t (order_no, ...) VALUES (...),衝突時靜默跳過不報錯不覆蓋。
  3. 業務主鍵 + 更新其他列:INSERT INTO t (order_no, col) VALUES (...) ON DUPLICATE KEY UPDATE col=VALUES(col),衝突時只更新非主鍵列。
  4. 批量插入:INSERT INTO t (col) VALUES ('a'),('b'),('c'),單條 SQL 插入多行,性能提升 10 倍+。

Navicat 可視化操作陷阱

Navicat「編輯表數據」界面默認顯示主鍵列,若手工輸入相同主鍵再點「應用」,實際執行的是 UPDATE 或 REPLACE。請確認:

  • 主鍵列是否勾選「自增」。
  • 新增行時主鍵欄留空。

總結

讓數據庫管主鍵(自增),業務邏輯別硬塞固定 ID。 覆蓋問題 99% 是主鍵衝突導致的預期行為,而非 Bug。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved