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

MySQL ON DUPLICATE KEY UPDATE 實戰:一條 SQL 解決「不存在插入、存在更新」

     編輯:MySQL 資料庫相關知識

背景痛點

傳統邏輯需 3 條 SQL:SELECT 判斷 → INSERT 或 UPDATE,存在競態條件與效能問題。

優雅解法

MySQL 4.1+ 支援 INSERT ... ON DUPLICATE KEY UPDATE,單條 SQL 原子完成。

表結構範例

CREATE TABLE ipstats (
    ip VARCHAR(15) NOT NULL UNIQUE,
    clicks SMALLINT(5) UNSIGNED NOT NULL DEFAULT 0
);

傳統寫法(3 條 SQL)

IF (SELECT * FROM ipstats WHERE ip='192.168.0.1') {
    UPDATE ipstats SET clicks=clicks+1 WHERE ip='192.168.0.1';
} ELSE {
    INSERT INTO ipstats (ip, clicks) VALUES ('192.168.0.1', 1);
}

優化寫法(1 條 SQL)

INSERT INTO ipstats VALUES('192.168.0.1', 1) 
ON DUPLICATE KEY UPDATE clicks=clicks+1;

前置條件

資料表必須擁有 PRIMARY KEY 或 UNIQUE INDEX,否則無法觸發重複鍵判斷。

進階用法

  • VALUES(col) 可引用插入值:ON DUPLICATE KEY UPDATE clicks=clicks+VALUES(clicks)
  • 多欄位更新:ON DUPLICATE KEY UPDATE col1=VALUES(col1), col2=col2+1
  • 配合 LAST_INSERT_ID() 取得自增 ID

適用場景

計數器累加、Upsert 業務、日誌去重寫入、快取同步等高併發寫入場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved