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

Prisma的connectOrCreate方法where条件是否支持使用AND组合查询?

问题原因
  • Prisma中connectOrCreate的where参数仅支持传入唯一索引/主键对应的查询条件,你当前报错是因为AccountNumber模型没有定义userId+accountNum的联合唯一索引,所以AccountNumberWhereUniqueInput类型不支持这两个字段的组合查询,也不支持在这个场景下用AND拼接条件。
解决步骤
  1. 首先修改Prisma Schema,给AccountNumber添加联合唯一约束
model AccountNumber {
  id         Int          @id @default(autoincrement())
  org        Organization @relation(fields: [orgId], references: [id])
  orgId      Int
  user       User         @relation(fields: [userId], references: [id])
  userId     Int
  accountNum String
  holdings   Holding[]

  // 新增联合唯一索引
  @@unique([userId, accountNum])
}

修改后运行prisma migrate dev生成新的数据库迁移,同时更新Prisma客户端类型。

  1. 调整业务代码的connectOrCreate参数,不需要用AND拼接条件,直接传入联合唯一索引对应的查询字段即可:
const holding = await client.holding.create({
  data: {
    holdingNum,
    accountNum: {
      connectOrCreate: {
        where: { 
          // 该字段是Prisma根据联合唯一索引自动生成的,命名规则为多个字段下划线拼接,可通过TS类型提示确认
          userId_accountNum: {
            userId: loggedInUser.id, 
            accountNum: accountNumber 
          }
        },
        create: {
          accountNumber,
          user: {
            connect: {
              id: loggedInUser.id,
            },
          },
          org: {
            connect: {
              orgCode,
            },
          },
        },
      },
    },
    product: {
      connectOrCreate: {
        where: {
          prodCode,
        },
        create: {
          prodCode,
          prodName,
        },
      },
    },
  },
});
替代方案

如果不想新增联合唯一索引,就不能使用connectOrCreate实现该逻辑,需要先手动查询AccountNumber是否存在,不存在则先创建,再关联到新建的Holding记录,可以通过数据库事务保证操作的原子性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:54:07