Prisma中Upsert操作使用复合索引及满足唯一约束Where条件的方法咨询
Prisma中Upsert操作使用复合索引及满足唯一约束Where条件的方法咨询
嗨,我来帮你搞定这个问题!针对Prisma模型里带@id或者复合@@unique约束的情况,在where语句里满足唯一约束其实分两种场景,我结合你给出的ContentTags模型来给你拆解:
1. 模型带单个@id的情况
如果你的模型是用单个字段作为主键(比如你ContentTags里的id Int @id @default(autoincrement())),那在where语句里直接指定这个id字段的值就能满足唯一约束,比如做upsert操作时:
const contentTag = await prisma.contentTags.upsert({ where: { id: 1 // 直接用主键id定位唯一记录 }, update: { label: "updated-label" }, create: { label: "new-label", userId: 2 } })
2. 模型带复合@@unique约束的情况
我看你贴的ContentTags模型里有未写完的@@uniq(应该是@@unique复合约束),通常这种是多字段组合的唯一规则,比如假设你要实现「同一个用户下的标签名不能重复」,模型应该是这样定义的:
model ContentTags { id Int @id @default(autoincrement()) userId Int? author User? @relation(fields: [userId], references: [id]) post Post[] label String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@unique([userId, label]) // 复合唯一约束:userId + label 组合唯一 }
这种情况下,where语句里必须包含复合约束里的所有字段,才能定位到唯一的记录。Prisma会自动给复合约束生成一个键名,格式是把约束里的字段名用下划线连接,比如这里就是userId_label,用在upsert里的示例:
const contentTag = await prisma.contentTags.upsert({ where: { userId_label: { userId: 2, label: "tech" } }, update: { updatedAt: new Date() }, create: { userId: 2, label: "tech" } })
如果你想自定义这个复合约束的名称,也可以在定义时加上name参数:
@@unique(fields: [userId, label], name: "UserLabelUnique")
那对应的where语句里就要用你自定义的名称:
where: { UserLabelUnique: { userId: 2, label: "tech" } }
额外提醒
不管是单个@id还是复合@@unique,核心都是在where语句里提供能唯一标识一条记录的所有字段,这样Prisma才能准确找到目标记录,通过唯一约束的校验。要是漏了复合约束里的某个字段,Prisma会直接报错提示你缺少必要的唯一条件哦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

