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

