You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Knex操作PostgreSQL条件Upsert如何引用待插入数据做字段对比

实现方案

PostgreSQL 执行 ON CONFLICT 逻辑时,待插入的冲突行会临时存放在名为 EXCLUDED 的虚拟表中,你可以通过 Knex 的 raw 方法引用该表的 act_ts 字段完成对比,正确写法如下:

await dbClient(table)
  .insert(records)
  .onConflict("digits")
  .merge()
  .where('act_ts', '<', dbClient.raw('EXCLUDED.act_ts'));

可选优化

如果你只需要更新部分字段而非整行覆盖,可以给 merge 方法传入需要更新的字段名数组,避免不必要的字段覆盖:

await dbClient(table)
  .insert(records)
  .onConflict("digits")
  .merge(['act_ts', 'field1', 'field2']) // 只更新数组内的指定字段
  .where('act_ts', '<', dbClient.raw('EXCLUDED.act_ts'));

内容的提问来源于stack exchange,提问作者Jorge Liano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:06:03