首页/数据/SQL 速查/MERGE 语句(PostgreSQL 15+)
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

MERGE 语句(PostgreSQL 15+)

标准化的“合并”语句:按条件匹配则更新、不匹配则插入(还可 WHEN NOT MATCHED BY SOURCE 时删除);PostgreSQL 15 起支持,MySQL 无此语句。

SQL 速查数据更新于 2026-10-12

PostgreSQL

PostgreSQL
MERGE INTO stock AS s
USING incoming AS i
ON s.sku = i.sku
WHEN MATCHED THEN
  UPDATE SET qty = s.qty + i.qty
WHEN NOT MATCHED THEN
  INSERT (sku, qty) VALUES (i.sku, i.qty);

MySQL 替代

MySQL 替代
INSERT INTO stock (sku, qty)
VALUES ('A1', 5) AS new
ON DUPLICATE KEY UPDATE qty = qty + new.qty;
PostgreSQLMERGE 支持多分支 WHEN;适合 ETL 合并场景
MySQL没有 MERGE;用 upsert 或“临时表 + UPDATE JOIN + INSERT SELECT”两步走
原子性单语句原子执行;并发下仍要依赖约束与隔离级别保证正确性

易错点

  • 源表同一键有多行匹配同一目标行时,PostgreSQL 会报 MERGE command cannot affect row a second time,合并前先去重
  • MERGE 与 upsert 的并发语义不同:都建议在高并发写入前做压测确认,不要假设“等价”

数据来源与参考

  • PostgreSQL Documentation · MERGE
  • MySQL 8.0 Reference Manual · INSERT ... ON DUPLICATE KEY UPDATE
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌