Prisma中基于联合唯一约束的多条件删除实现问题
解决Prisma联合唯一约束下的删除操作问题
问题核心原因
你遇到的无效删除问题,主要出在两个地方:
- 模型调用名称错误:你定义的模型是
CommentDislike,但代码里写的是prisma.commentLike.delete,Prisma找不到对应模型,自然无法执行删除。 - 联合唯一约束的where条件写法错误:当用
@@unique([user_id, comment_id])定义联合唯一约束后,Prisma会自动生成格式为字段1_字段2的复合唯一标识符,直接在where中并列写两个字段无法匹配这个约束规则。
修复方案
方案1:使用自动生成的复合唯一键
根据你的联合唯一约束,Prisma会生成user_id_comment_id这个复合键,用它来构造where条件即可:
try { await prisma.commentDislike.delete({ where: { user_id_comment_id: { user_id: user_id, comment_id: comment_id, }, }, }); } catch (e: any) { console.log(e); }
方案2:改用deleteMany(无需依赖复合键名称)
因为联合唯一约束保证了符合user_id+comment_id条件的记录最多只有一条,也可以用deleteMany来实现删除:
try { await prisma.commentDislike.deleteMany({ where: { user_id: user_id, comment_id: comment_id, }, }); } catch (e: any) { console.log(e); }
额外注意点
- 必须给异步操作加
await,否则代码会跳过删除逻辑直接执行后续代码,导致看起来删除无效。 - 检查传入的
user_id和comment_id类型是否和模型定义一致:模型中user_id是String类型,comment_id是Int类型,类型不匹配会导致无法匹配到目标记录。
内容的提问来源于stack exchange,提问作者stellenberger
相关产品推荐
相关产品推荐

