MySQL 4.1+ 支援此語法,將「查詢→決定→插入/更新」三步合為一條 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;
前提:表必須有唯一索引或主鍵(此處 ip 為 UNIQUE)。
| 特性 | REPLACE INTO | ON DUPLICATE KEY UPDATE |
|---|---|---|
| 主鍵不存在 | 同 INSERT | 同 INSERT |
| 主鍵存在 | DELETE + INSERT(全欄位重寫) | 僅 UPDATE 指定欄位 |
| 未提供欄位 | 重置為預設值 | 保持原值不變 |
| 自增 ID | 會變更 | 不變 |
結論:優先用 ON DUPLICATE KEY UPDATE,避免資料遺失與自增 ID 跳變。
INSERT INTO t(a,b,c) VALUES
('a1','b1','c1'),('a2','b2','c2')
ON DUPLICATE KEY UPDATE c=VALUES(c);
VALUES(c) 參照插入值列表中對應的 c 值。