SQLのUNIQUE制約をPrismaの@uniqueと@@uniqueに変換する
単一カラムおよび複合カラムのSQL UNIQUE制約がPrismaの@uniqueフィールド属性と@@unique model属性にどのようにマッピングされるかを学びます。
詳細な説明
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構文にマッピングします。