使用複合 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
當使用 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 或唯一約束更新和更新插入記錄
複合 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,
},
},
},
},
},
})