跳到主要内容

使用复合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

复合 ID 和复合唯一约束在创建关联数据时也可以与 connectconnectOrCreate 一起使用。

按复合 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 和复合唯一约束也可以用于连接记录以创建关系时使用的 connectconnectOrCreate 键中。

例如,考虑以下查询

await prisma.user.create({
data: {
name: 'Alice',
likes: {
connect: {
likeId: {
postId: 1,
userId: 2,
},
},
},
},
})

likeId 复合 ID 在 connect 对象中用作标识符,用于查找将链接到新用户:"Alice"Like 表记录。

类似地,likeId 可用于 connectOrCreatewhere 过滤器中,以尝试在 Like 表中查找现有记录

await prisma.user.create({
data: {
name: 'Alice',
likes: {
connectOrCreate: {
create: {
postId: 1,
},
where: {
likeId: {
postId: 1,
userId: 1,
},
},
},
},
},
})
© . All rights reserved.