メインコンテンツにスキップ

複合IDと複合ユニーク制約の操作

複合IDと複合ユニーク制約は、@@idおよび@@unique属性を使用してPrismaスキーマで定義できます。

警告

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またはユニーク制約によるレコードの更新とアップサート

複合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オブジェクトの識別子として使用されます。

同様に、likeIdconnectOrCreatewhereフィルターで使用され、Likeテーブル内の既存のレコードを特定しようとします。

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