SQLのUNIQUE制約をPrismaの@uniqueと@@uniqueに変換する

単一カラムおよび複合カラムのSQL UNIQUE制約がPrismaの@uniqueフィールド属性と@@unique model属性にどのようにマッピングされるかを学びます。

Advanced Features

詳細な説明

PrismaにおけるUNIQUE制約

SQLのUNIQUE制約は、2つの行が同じ値(または値の組み合わせ)を共有しないことを保証します。Prismaは単一フィールドと複数フィールドの両方のユニーク制約をサポートしています。

単一カラムのユニーク

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  email VARCHAR(320) NOT NULL UNIQUE,
  username VARCHAR(50) NOT NULL,
  CONSTRAINT uq_users_username UNIQUE (username)
);
model User {
  id       Int    @id @default(autoincrement())
  email    String @unique @db.VarChar(320)
  username String @unique @db.VarChar(50)

  @@map("users")
}

インラインのUNIQUEと名前付きCONSTRAINT ... UNIQUEはどちらもPrismaの@uniqueフィールド属性にマッピングされます。

複合カラムのユニーク

CREATE TABLE team_members (
  id SERIAL PRIMARY KEY,
  team_id INTEGER NOT NULL,
  user_id INTEGER NOT NULL,
  role VARCHAR(50) NOT NULL,
  CONSTRAINT uq_team_user UNIQUE (team_id, user_id)
);
model TeamMember {
  id     Int    @id @default(autoincrement())
  teamId Int    @map("team_id")
  userId Int    @map("user_id")
  role   String @db.VarChar(50)

  @@unique([teamId, userId])
  @@map("team_members")
}

複合カラムのユニーク制約はmodelレベルの@@unique([...])を使用します。これにより、すべての行にわたって値の組み合わせが一意であることが保証されます。

ユニーク vs インデックス

機能 @@unique @@index
一意性を強制 はい いいえ
クエリパフォーマンスを向上 はい はい
重複値を許可 いいえ はい
PrismaのfindUniqueで使用 はい いいえ

PrismaのfindUnique()findUniqueOrThrow()メソッドは@id@uniqueフィールドの両方で動作します。複数フィールドのユニーク制約は複合findUniqueクエリを可能にします:

const member = await prisma.teamMember.findUnique({
  where: {
    teamId_userId: { teamId: 1, userId: 42 }
  }
});

名前付き制約

Prismaはmapパラメータでカスタム制約名を許可します:

@@unique([teamId, userId], map: "uq_team_user")

コンバーターはmapを使用して元のSQL制約名を保持します。

部分ユニーク(PostgreSQL)

PostgreSQLは条件付きユニークインデックスをサポートしています:

CREATE UNIQUE INDEX uq_users_active_email ON users (email) WHERE deleted_at IS NULL;

Prismaは部分ユニーク制約をネイティブにサポートしていません。コンバーターは@default(dbgenerated(...))にフォールバックするか、制限事項を示すコメントを追加します。

Nullableカラムのユニーク

ほとんどのデータベースでは、NULL値はユニーク制約から除外されます — 複数の行がユニークカラムにNULLを持つことができます。電話番号のようなオプショナルなユニークフィールドで重要です:

phone String? @unique

ユースケース

データベースにメールとユーザー名フィールドの単一カラムユニーク制約と、各ユーザーがチーム内で1回のみ出現することを保証する複合ユニーク制約がある場合に、コンバーターが両方のパターンを適切なPrismaの@uniqueと@@unique構文にマッピングします。

試してみる — SQL to Prisma Schema

フルツールを開く