🔑

Prismaで複合主キーを設定する

2023/03/21に公開

複合主キーとは

複合主キーがわからない人は以下のサイトがわかりやすくまとめられています。
https://medium-company.com/複合主キー/
https://wa3.i-3-i.info/word1993.html

一言でいうと、複数の項目の組み合わせを 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,
    },
  },
})

参考

https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#unique-1

GitHubで編集を提案

Discussion