MERGE与UPSERT策略深度对比:并发与环境差异
比较MERGE、INSERT ON CONFLICT和NOT EXISTS三种更新插入方式的竞态条件。 · 难度:入门 · +10XP
MERGE与UPSERT策略深度对比:并发与环境差异
不同数据库对UPSERT的实现差异巨大(MERGE标准、PostgreSQL的ON CONFLICT、MySQL的REPLACE)。本教程用同一张库存表测试三种方法在高并发下的表现,分析幻读、死锁及回滚风险。你将学会如何选用合适方案:MERGE适合复杂条件更新,ON CONFLICT适合高吞吐但简单的场景,NOT EXISTS适合低并发但逻辑清晰的场景。
-- PostgreSQL 推荐方案:INSERT ON CONFLICT
INSERT INTO inventory (product_id, quantity) VALUES (1, 50)
ON CONFLICT (product_id)
DO UPDATE SET quantity = inventory.quantity + EXCLUDED.quantity
WHERE inventory.quantity >= 0;
-- 标准SQL替代:MERGE
MERGE INTO inventory AS t
USING (VALUES (1, 50)) AS s(product_id, quantity)
ON t.product_id = s.product_id
WHEN MATCHED THEN UPDATE SET quantity = t.quantity + s.quantity
WHEN NOT MATCHED THEN INSERT VALUES (s.product_id, s.quantity);