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属性は単一カラムに適用されます。複数カラムのユニーク性(例:firstNameとlastNameのユニークな組み合わせ)には、モデルレベルの@@uniqueを使用します。詳細は複合ユニークの例をご覧ください。
ユースケース
メールアドレスとユーザー名がすべてのアカウントでユニークでなければならないユーザー登録システムを設計しており、データベースレベルでこれらの制約を強制するSQLスキーマが必要です。