跳到主要內容

使用複合 ID 和唯一約束

複合 ID 和複合唯一約束可以使用 @@id@@unique 屬性在您的 Prisma schema 中定義。

警告

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 和複合唯一約束可以在處理唯一資料時使用。

以下是 Prisma Client 函數的列表,這些函數在查詢的 where 篩選器中接受複合 ID 或複合唯一約束

  • findUnique()
  • findUniqueOrThrow
  • delete
  • update
  • upsert

當使用 connectconnectOrCreate 建立關聯式資料時,複合 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 或唯一約束更新和更新插入記錄

複合 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,
},
},
},
},
},
})