Prisma @uniqueからSQL UNIQUE制約への変換

Prisma @uniqueフィールド属性がどのように個別カラムのSQL UNIQUE制約に変換されるかを学びます。メール、ユーザー名、スラッグフィールドの例を含みます。

Basic Models

詳細な説明

単一フィールドのUNIQUE制約

Prismaのフィールドに対する@unique属性は、対応するカラムのSQL UNIQUE制約に直接変換されます。

Prismaスキーマの例

model Account {
  id       Int    @id @default(autoincrement())
  email    String @unique
  username String @unique
  slug     String @unique
  name     String

  @@map("accounts")
}

生成されるSQL

CREATE TABLE accounts (
  id SERIAL PRIMARY KEY,
  email VARCHAR(255) NOT NULL UNIQUE,
  username VARCHAR(255) NOT NULL UNIQUE,
  slug VARCHAR(255) NOT NULL UNIQUE,
  name VARCHAR(255) NOT NULL
);

SQLでのUNIQUEの動作

UNIQUE制約はテーブル内の2つの行が同じカラムに同じ値を持たないことを保証します。データベースはこの制約を強制するために自動的にユニークインデックスを作成します。主な動作:

  • NULLの処理: ほとんどのデータベースで、UNIQUEカラムに複数のNULL値が許可されます(NULLはNULLと等しくないため)。ただし、これはダイアレクトにより異なります。
  • 重複時のエラー: UNIQUEカラムに重複した値をINSERTまたはUPDATEしようとすると、制約違反エラーが発生します。
  • パフォーマンス: ユニークインデックスはそのカラムでの検索も高速化します。

オプショナルフィールドのUNIQUE

Prismaフィールドがオプション(?)かつユニークの場合:

model Profile {
  id       Int     @id @default(autoincrement())
  nickname String? @unique
}

nullableかつユニークなカラムが生成されます。ほとんどのデータベースでUNIQUEカラムに複数のNULL値が許可されます — 非NULL値のみがユニークでなければなりません。

複合UNIQUEとの違い

@unique属性は単一カラムに適用されます。複数カラムのユニーク性(例:firstNamelastNameのユニークな組み合わせ)には、モデルレベルの@@uniqueを使用します。詳細は複合ユニークの例をご覧ください。

ユースケース

メールアドレスとユーザー名がすべてのアカウントでユニークでなければならないユーザー登録システムを設計しており、データベースレベルでこれらの制約を強制するSQLスキーマが必要です。

試してみる — Prisma to SQL Schema

フルツールを開く