Prisma @@uniqueからSQL複合UNIQUE制約への変換
Prisma @@uniqueモデルレベル属性をSQL複合UNIQUE制約に変換します。複数カラムのユニーク性が単一カラムの@uniqueとどう異なるかを学びます。
Advanced
詳細な説明
複合UNIQUE制約
Prismaのモデルレベルの@@unique属性は、指定されたカラム全体での値の組み合わせがユニークであることを保証する複数カラムのユニーク性制約を作成します。
Prismaスキーマの例
model TenantUser {
id Int @id @default(autoincrement())
tenantId Int @map("tenant_id")
email String
name String
role String @default("member")
@@unique([tenantId, email])
@@map("tenant_users")
}
生成されるSQL
CREATE TABLE tenant_users (
id SERIAL PRIMARY KEY,
tenant_id INTEGER NOT NULL,
email VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL,
role VARCHAR(255) NOT NULL DEFAULT 'member',
UNIQUE (tenant_id, email)
);
@uniqueとの違い
| 属性 | スコープ | 例 |
|---|---|---|
@unique |
単一カラム | email String @unique — 各メールがグローバルにユニーク |
@@unique |
複数カラム | @@unique([tenantId, email]) — 組み合わせがユニーク |
@@unique([tenantId, email])では、各出現が異なるtenantIdを持つ限り、同じメールが複数回存在できます。これはマルチテナントアプリケーションに不可欠です。
複数の複合UNIQUE
同じモデルに複数の@@unique制約を持つことができます:
model Integration {
id Int @id @default(autoincrement())
provider String
externalId String @map("external_id")
tenantId Int @map("tenant_id")
apiKey String @map("api_key")
@@unique([provider, externalId])
@@unique([tenantId, provider])
@@map("integrations")
}
各@@uniqueはSQL出力で別々のUNIQUE (...)制約を生成します。データベースはすべてを独立して強制します。
複合UNIQUEと複合主キー
@@uniqueはユニーク性を強制し、@@idは主キーを定義します。テーブルは1つの主キーしか持てませんが、複数のユニーク制約を持てます。フィールドの組み合わせが行の識別子として機能すべき場合は@@idを、重複を防ぐだけの場合は@@uniqueを使用してください。
ユースケース
各テナントのユーザーが他のテナントのユーザーと同じメールアドレスを持てるが、単一テナント内では各メールがユニークでなければならないマルチテナントSaaSアプリケーションを構築しています。