複合IDとユニーク制約の操作
複合IDと複合ユニーク制約は、Prismaスキーマで@@id
および@@unique
属性を使用して定義できます。
MongoDBは@@id
をサポートしていません
MongoDBは複合IDをサポートしていないため、@@id
属性でモデルを識別することはできません。
複合IDまたは複合ユニーク制約は、データベーステーブルの主キーまたは識別子として、2つのフィールドの結合値を使用します。次の例では、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
}
レスポンスには2つのフィールドしかありませんが、これらの2つのフィールドが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と複合ユニーク制約は、connect
およびconnectOrCreate
を使用してリレーショナルデータを作成する場合にも使用できます。
複合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は、新しいユーザー「Alice」にリンクされるLike
テーブルのレコードを特定するために使用されるconnect
オブジェクトの識別子として使用されます。
同様に、likeId
はconnectOrCreate
のwhere
フィルターで使用して、Like
テーブルの既存のレコードを特定しようとすることができます。
await prisma.user.create({
data: {
name: 'Alice',
likes: {
connectOrCreate: {
create: {
postId: 1,
},
where: {
likeId: {
postId: 1,
userId: 1,
},
},
},
},
},
})