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アプリケーションを構築しています。

試してみる — Prisma to SQL Schema

フルツールを開く