傳統邏輯需 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
);
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);
}
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+1LAST_INSERT_ID() 取得自增 ID計數器累加、Upsert 業務、日誌去重寫入、快取同步等高併發寫入場景。