使用复合ID和唯一约束
复合 ID 和复合唯一约束可以在你的 Prisma schema 中使用 @@id
和 @@unique
属性定义。
MongoDB 不支持 @@id
MongoDB 不支持复合 ID,这意味着你无法使用 @@id 属性标识模型。
复合 ID 或复合唯一约束使用两个字段的组合值作为数据库表中的主键或标识符。在以下示例中,postId 字段和 userId 字段被用作 Like 表的复合 ID
model User {
id Int @id @default(autoincrement())
name String
post Post[]
likes Like[]
}
model Post {
id Int @id @default(autoincrement())
content String
User User? @relation(fields: [userId], references: [id])
userId Int?
likes Like[]
}
model Like {
postId Int
userId Int
User User @relation(fields: [userId], references: [id])
Post Post @relation(fields: [postId], references: [id])
@@id([postId, userId])
}
查询 Like 表中的记录(例如使用 prisma.like.findMany()
)将返回如下所示的对象
{
"postId": 1,
"userId": 1
}
尽管响应中只有两个字段,但这两个字段构成了一个名为 postId_userId
的复合 ID。
你也可以通过使用 @@id
或 @@unique
属性的 name
字段来创建一个命名复合 ID 或复合唯一约束。例如
model Like {
postId Int
userId Int
User User @relation(fields: [userId], references: [id])
Post Post @relation(fields: [postId], references: [id])
@@id(name: "likeId", [postId, userId])
}
在何处使用复合 ID 和唯一约束
复合 ID 和复合唯一约束可用于处理唯一数据。
以下是接受在查询的 where
过滤器中使用复合 ID 或复合唯一约束的 Prisma Client 函数列表
findUnique()
findUniqueOrThrow
delete
update
upsert
在通过 connect
和 connectOrCreate
创建关系数据时,复合 ID 和复合唯一约束也可用。
通过复合 ID 或唯一约束过滤记录
尽管你的查询结果不会将复合 ID 或唯一约束显示为字段,但你可以使用这些复合值来过滤查询以查找唯一记录
const like = await prisma.like.findUnique({
where: {
likeId: {
userId: 1,
postId: 1,
},
},
})
注意:复合 ID 和复合唯一约束键仅可用作 findUnique()
和 findUniqueOrThrow
等唯一查询的过滤选项。请参阅上面部分,了解这些字段可能被使用的位置列表。
通过复合 ID 或唯一约束删除记录
复合 ID 或复合唯一约束可用于 delete
查询的 where
过滤器中
const like = await prisma.like.delete({
where: {
likeId: {
userId: 1,
postId: 1,
},
},
})
通过复合 ID 或唯一约束更新和 upsert 记录
复合 ID 或复合唯一约束可用于 update
查询的 where
过滤器中
const like = await prisma.like.update({
where: {
likeId: {
userId: 1,
postId: 1,
},
},
data: {
postId: 2,
},
})
它们也可以用于 upsert
查询的 where
过滤器中
await prisma.like.upsert({
where: {
likeId: {
userId: 1,
postId: 1,
},
},
update: {
userId: 2,
},
create: {
userId: 2,
postId: 1,
},
})
通过复合 ID 或唯一约束过滤关联查询
复合 ID 和复合唯一约束也可用于连接记录以创建关系时使用的 connect
和 connectOrCreate
键中。
例如,考虑此查询
await prisma.user.create({
data: {
name: 'Alice',
likes: {
connect: {
likeId: {
postId: 1,
userId: 2,
},
},
},
},
})
likeId
复合 ID 用作 connect
对象中的标识符,该对象用于查找将链接到新用户:“Alice”的 Like 表中的记录。
类似地,likeId
可用于 connectOrCreate
的 where
过滤器中,以尝试查找 Like 表中的现有记录
await prisma.user.create({
data: {
name: 'Alice',
likes: {
connectOrCreate: {
create: {
postId: 1,
},
where: {
likeId: {
postId: 1,
userId: 1,
},
},
},
},
},
})