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

Prisma中update/upsert无法用user_id查询的类型问题解决

解决Prisma中update/upsert时无法用user_id作为where条件的类型错误

问题根源

Prisma的update、upsert方法要求where参数必须传入唯一标识字段,对应自动生成的sessionsWhereUniqueInput类型。当前你的模型只有id被纳入这个唯一标识类型,所以user_id无法作为where条件传入,触发类型错误。

解决方法

根据你的业务场景选择以下方案:

1. 给user_id添加唯一约束(推荐单session用户场景)

如果业务要求每个用户最多对应一个session,直接在Prisma Schema中给user_id添加@unique约束:

model sessions {
  id      BigInt  @id @default(autoincrement())
  hash    String
  user_id BigInt  @unique // 添加唯一约束
}

执行npx prisma generate重新生成类型定义后,sessionsWhereUniqueInput会自动包含user_id,此时就能直接在update/upsert的where中使用user_id:

await prisma.sessions.upsert({
  where: { user_id: id },
  update: { hash },
  create: { hash, user_id: id },
});

2. 使用updateMany替代update(多session用户场景)

如果一个用户可以对应多个session,不需要user_id唯一,改用updateMany方法——它的where参数支持普通筛选条件,不需要唯一键:

await prisma.sessions.updateMany({
  where: { user_id: id },
  data: { hash },
});

注意:updateMany会更新所有匹配user_id的session,返回值是更新的记录条数,而非单条session对象。

3. 先查询再更新(精准更新单条多session记录)

如果要更新用户的某一条特定session,又不想给user_id加唯一约束,可以先通过findFirst定位记录,再用id更新:

const targetSession = await prisma.sessions.findFirst({
  where: {
    user_id: id,
    // 可添加额外筛选条件定位具体session,比如创建时间等
  },
});

if (targetSession) {
  await prisma.sessions.update({
    where: { id: targetSession.id },
    data: { hash },
  });
}

关于是否需要将user_id设为唯一主键

不需要强制设为主键:

  • 只需给user_id添加@unique唯一约束,就能让它成为where的唯一标识字段,同时保留id作为自增主键,这也是更常见的数据库设计方案。
  • 若业务上user_id本身就能唯一标识session(比如单session机制),也可以将user_id设为主键,但这种场景下id字段可以省略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:40:29