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

如何在Prisma中实现对应SQL的upsert冲突更新查询

Prisma 实现对应SQL逻辑的Upsert写法

前置配置

首先需要在Prisma Schema中为user_conference表配置user_id、conference_id的联合唯一约束,否则Prisma无法识别冲突判定键,参考Schema定义:

model UserConference {
  userId              Int      @map("user_id")
  conferenceId        String   @map("conference_id")
  points              Int
  activitiesCompleted String[] @map("activities_completed")

  // 对应SQL中的联合唯一冲突键
  @@unique([userId, conferenceId])
  @@map("user_conference")
}

实现代码

直接使用Prisma客户端提供的upsert方法,搭配原子操作符即可完全复现给出的SQL逻辑:

const record = await prisma.userConference.upsert({
  where: {
    // 联合唯一键的查询条件,键名默认为「字段1_字段2」格式,如果给@@unique设置了自定义name则替换为自定义名称
    userId_conferenceId: {
      userId: 1,
      conferenceId: '3a4QQI0KbO0eaDjzhIgeeZ'
    }
  },
  // 记录不存在时执行插入逻辑
  create: {
    userId: 1,
    conferenceId: '3a4QQI0KbO0eaDjzhIgeeZ',
    points: 40,
    activitiesCompleted: ['4vwp3L1EJYQ9rI1Pv7er2']
  },
  // 命中唯一键冲突时执行更新逻辑
  update: {
    points: {
      increment: 40 // 原子累加:在原有points值基础上加40
    },
    activitiesCompleted: {
      push: '4vwp3L1EJYQ9rI1Pv7c4x0' // 原子追加:向数组尾部添加指定活动ID
    }
  }
})

注意事项

  • 上述写法用到的increment、push是Prisma的原子操作符,执行过程不存在并发下的读写竞态,和提供的原生SQL执行效果完全一致。
  • 该写法默认适配PostgreSQL,和示例SQL里的数组类型、数组拼接语法对应。如果使用不支持原生数组的数据库(比如MySQL),需要先把字段类型调整为Json类型,再对应调整数组操作逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:15:40