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

如何在Prisma的updateMany方法中访问每条受影响的记录?

Prisma updateMany 无法访问单条记录的解决方案

Prisma 的 updateMany 不支持你示例中传入回调访问每条记录的用法——它是批量更新操作,会生成单条 SQL 语句直接在数据库层面执行,不会将每条记录拉取到客户端处理。要实现基于记录当前值的批量更新,有以下几种可行方案:

方案1:查询后逐个更新(适合小数据量)

先获取需要更新的记录,再循环调用单条 update 处理每条数据:

// 获取目标用户记录
const users = await prisma.user.findMany({
  where: { /* 你的过滤条件,可选 */ }
});

// 逐条更新
for (const user of users) {
  await prisma.user.update({
    where: { id: user.id },
    data: { encryptedId: encrypt(user.id) }
  });
}

这种方式逻辑简单,但数据量大时会产生 N+1 查询问题,性能较低。

方案2:分批批量更新(适合大数据量)

如果数据量较大,可分批查询并并行更新,平衡性能与内存占用:

const batchSize = 100;
let skip = 0;

while (true) {
  // 分批获取记录ID
  const users = await prisma.user.findMany({
    where: { /* 过滤条件 */ },
    take: batchSize,
    skip: skip,
    select: { id: true } // 只查询需要的字段,减少数据传输
  });

  if (users.length === 0) break;

  // 并行执行更新操作
  const updatePromises = users.map(user => 
    prisma.user.update({
      where: { id: user.id },
      data: { encryptedId: encrypt(user.id) }
    })
  );

  await Promise.all(updatePromises);
  skip += batchSize;
}

方案3:使用原生SQL(性能最优)

如果你的加密逻辑可以在数据库层面实现(比如数据库支持内置加密函数),直接用原生 SQL 执行批量更新是性能最好的方式:

await prisma.$executeRaw`
  UPDATE "User" 
  SET "encryptedId" = encrypt("id") 
  -- 添加WHERE条件过滤需要更新的记录,例如:WHERE "status" = 'active'
`;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:32:15