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

knex执行upsert操作 如何在创建记录失败时自增对应字段值

问题解决方案

这个需求可以直接通过Knex原生方法实现,不需要编写完整原生SQL。你之前写法报错的核心原因是onConflict方法后需要搭配.merge()指定冲突后的更新逻辑,不支持直接链式调用.increment()。

正确实现代码

await databaseService.knex('myTable')
  .insert({
    id: id1,
    value: 0
  })
  // 此处冲突字段要和表中唯一索引字段一致,你之前传的id1为变量名,属于拼写错误
  .onConflict('id')
  .merge({
    // 通过Knex.raw实现字段自增,避免SQL注入风险
    value: databaseService.knex.raw('?? + 1', ['value'])
  });

注意事项

  • 以上写法兼容PostgreSQL 9.5+、MySQL 8.0+、SQLite 3.24+等支持标准upsert语法的数据库
  • 如果是低版本MySQL,可以替换为onDuplicateKeyUpdate方法实现相同逻辑,写法如下:
await databaseService.knex('myTable')
  .insert({
    id: id1,
    value: 0
  })
  .onDuplicateKeyUpdate({
    value: databaseService.knex.raw('?? + 1', ['value'])
  });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:09:00