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
相关产品推荐
相关产品推荐

