業務常見需求:寫入資料時,若主鍵/唯一鍵衝突則更新,否則插入新行。MySQL 提供 INSERT ... ON DUPLICATE KEY UPDATE 語法,配合唯一索引即可單條 SQL 完成「Upsert」邏輯,避免「先查再寫」的競態與效能損耗。
INSERT INTO `table` (id, user_id, token, online)
VALUES (NULL, '2479031', '232', 1)
ON DUPLICATE KEY UPDATE
user_id = VALUES(user_id),
token = VALUES(token),
online = VALUES(online);
-- 單欄唯一索引
ALTER TABLE `table_name` ADD UNIQUE (user_id);
-- 組合唯一索引
ALTER TABLE `table_name` ADD UNIQUE (user_id, device_id);
無唯一索引,ON DUPLICATE KEY UPDATE永不觸發,視同普通INSERT。
介面:GET /report?user_id=2479031&device=xxx&online=1
邏輯:用戶每次開啟/關閉 App 呼叫,以 user_id 為唯一鍵,存在則更新 token、online,不存在則新增。

user_id='2479031'UPDATE 部分,相當於:
UPDATE `table`
SET user_id='2479031', token='232', online=1
WHERE user_id='2479031';
VALUES(col) 引用插入值,避免硬編碼IF()、CASE WHEN 做條件更新LOAD DATA ... ON DUPLICATE KEY UPDATE 或分批提交AUTO_INCREMENT 主鍵在衝突更新時仍會消耗自增值(已知行為,5.7+ 可用 innodb_autoinc_lock_mode=2 緩解)掌握此模式,單表 Upsert 不再需要應用層邏輯判斷,簡潔且原子化。