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

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

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

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