MySQL
MySQL
INSERT INTO counters (name, cnt)
VALUES ('pv', 1) AS new
ON DUPLICATE KEY UPDATE cnt = cnt + new.cnt;
-- 8.0.20 起推荐行别名;旧的 VALUES(col) 写法已废弃PostgreSQL
PostgreSQL
INSERT INTO counters (name, cnt)
VALUES ('pv', 1)
ON CONFLICT (name)
DO UPDATE SET cnt = counters.cnt + EXCLUDED.cnt;
-- 只跳过冲突
INSERT INTO counters (name, cnt) VALUES ('pv', 1)
ON CONFLICT (name) DO NOTHING;| 冲突依据 | MySQL:任意 UNIQUE/主键冲突都触发;PG:只认冲突目标列(列上需有唯一约束) |
|---|---|
| 原子性 | 两库都是单语句原子操作,比“先查再插”并发安全 |
| 自增 | MySQL 冲突走 UPDATE 时 AUTO_INCREMENT 仍可能前进,留下空洞 |