🔑
Prismaで複合主キーを設定する
複合主キーとは
複合主キーがわからない人は以下のサイトがわかりやすくまとめられています。
一言でいうと、複数の項目の組み合わせを 1 つの主キーとして定義すること です。
例として学校の名簿を見てみます。
「学年」「組」「出席番号」それぞれ単体では重複しますが、3つの組み合わせを1セットと考えたときに重複することはありません。
つまり、「学年」「組」「出席番号」を組み合わせることで一意の複合主キーができます。
学年 | 組 | 出席番号 | 名前 |
---|---|---|---|
1 | 1 | 1 | 一郎 |
1 | 1 | 2 | 二郎 |
1 | 1 | 3 | 三郎 |
1 | 3 | 1 | 花子 |
実装する
Prismaで複合主キーを定義するには@@unique
を使います。
schema.prisma
model Student {
id Int @id @default(autoincrement())
grade Int
group Int
number Int
name String
@@unique(fields: [grade, group, number], name: "student_identifier")
}
ちなみに fields や name を省略した書き方も可能です。
schema.prisma
@@unique(fields: [grade, group, number])
@@unique([grade, group, number])
name オプションを付けない場合、デフォルトは fields をアンダースコアでつなげた形になります。
(上2つの name は grade_group_number
になる)
注意
schema.prisma
model Student {
id Int @id @default(autoincrement())
grade Int
group Int
number Int?
name String
@@unique([grade, group, number], name: "student_identifier")
}
使い方
where オプションで他のユニークフィールドと同じように使えます。
const student = await prisma.student.findUnique({
where: {
student_identifier: {
grade: 1,
group: 1,
number: 1,
},
},
})
参考
Discussion