首页/数据/数据工程与 ETL 速查/幂等落库:主键 upsert
CDC 与同步53 条

幂等落库:主键 upsert

增量同步最常见的幂等写法是主键 upsert:MySQL 用 INSERT ... ON DUPLICATE KEY UPDATE,PostgreSQL 用 INSERT ... ON CONFLICT,Hive/Spark/Iceberg/Delta 用 MERGE。同一主键重复消费只会覆盖成相同结果,天然容忍重放;delete 事件要另行按主键删除或标记。

MySQL 8.0.19+ 行别名写法

MySQL 8.0.19+ 行别名写法
INSERT INTO dw.orders (order_id, amount, status, updated_at)
VALUES (?, ?, ?, ?) AS new
ON DUPLICATE KEY UPDATE
  amount = new.amount,
  status = new.status,
  updated_at = new.updated_at;
前提目标表要有主键或唯一索引,否则 upsert 退化
旧写法VALUES(col) 引用方式 8.0.20 起被弃用
MERGEHive 3 / Spark / Iceberg / Delta 的通用替代
删除处理op=d 需要 DELETE 或墓碑标记,不能只 upsert
Hive 的 MERGE 需要表具备事务特性(如 ORC + ACID)等条件,使用前先确认表属性。

易错点

  • 目标表没有主键约束,upsert 变成重复插入,行数翻倍
  • 只处理 insert/update,源端删除的行永远留在目标端

数据来源与参考

  • MySQL 8.0 Reference Manual: INSERT ... ON DUPLICATE KEY UPDATE
  • Apache Hive 官方文档(MERGE)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌