跳到主要內容

使用複合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,
},
},
},
},
},
})
© . This site is unofficial and not affiliated with Prisma Data, Inc.