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

