Prisma ORM:如何用同表field2的值更新field1字段?
批量更新同表字段的可行方案
Prisma 的 updateMany API 本身不支持直接在更新数据时引用同表的其他字段(类似 SQL 里 SET field1 = field2 的逻辑),所以你之前的写法会失效。下面是两种可行的实现方式:
方法一:使用原生 SQL 查询(推荐)
这是效率最高的方案,直接执行单条 SQL 语句完成批量更新,和原生 SQL 的逻辑完全一致。根据你使用的数据库,写法如下:
代码示例(适配 PostgreSQL/MySQL)
await prisma.$executeRaw` UPDATE "myTable" SET "field1" = "field2", "someRandomField" = 'xyz' WHERE "userId" = 1234; `;
注意:如果你的数据库是 MySQL,表名和字段名可以用反引号包裹或直接使用;如果是 PostgreSQL,需要用双引号确保名称匹配(Prisma 会将模型中的驼峰命名转换为数据库中的蛇形命名,比如 myTable 对应数据库里的 my_table,你需要根据实际情况调整)。
方法二:事务 + 批量更新(备选)
如果因某些限制无法使用原生 SQL,可以通过事务先查询目标记录,再批量执行更新。但这种方式会生成多条 UPDATE 语句,性能远不如原生 SQL,仅作为备选:
const prisma = new PrismaClient(); await prisma.$transaction(async (tx) => { // 查询需要更新的记录,只获取必要字段 const targetRecords = await tx.myTable.findMany({ where: { userId: 1234 }, select: { id: true, field2: true } }); // 批量执行更新 await Promise.all( targetRecords.map(record => tx.myTable.update({ where: { id: record.id }, data: { field1: record.field2, someRandomField: 'xyz' } }) ) ); });
为什么你的原有代码无效?
你尝试的 field1: { set: { field2 } } 写法不符合 Prisma 的语法规范:updateMany 的 data 参数中,set 只能接受固定值或 Prisma 提供的内置操作(比如 increment),无法直接引用同表的其他字段。
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

