Drizzleにおけるユニーク制約とインデックス
SQLのUNIQUE制約とCREATE UNIQUE INDEX文をDrizzle ORMスキーマの.unique()チェーンとunique()テーブル制約に変換します。
Best Practices
詳細な説明
Drizzleにおけるユニーク制約
ユニーク制約は、カラムまたはカラムの組み合わせで2つの行が同じ値を持たないことを保証します。Drizzleは2つの方法を提供します:カラムレベルの.unique()チェーンとテーブルレベルのunique()制約。
単一カラムのユニーク
SQL:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
username VARCHAR(50) NOT NULL UNIQUE
);
Drizzle:
import { pgTable, serial, varchar } from "drizzle-orm/pg-core";
export const users = pgTable("users", {
id: serial("id").primaryKey(),
email: varchar("email", { length: 255 }).notNull().unique(),
username: varchar("username", { length: 50 }).notNull().unique(),
});
カラムビルダーの.unique()チェーンは単一カラムのユニーク制約を作成します。これは最もシンプルな形式で、SQLのUNIQUEキーワードから直接マッピングされます。
複合ユニーク制約
SQL:
CREATE TABLE team_members (
team_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
role VARCHAR(50) NOT NULL,
UNIQUE (team_id, user_id)
);
Drizzle:
import { integer, pgTable, unique, varchar } from "drizzle-orm/pg-core";
export const teamMembers = pgTable("team_members", {
teamId: integer("team_id").notNull(),
userId: integer("user_id").notNull(),
role: varchar("role", { length: 50 }).notNull(),
}, (table) => [
unique().on(table.teamId, table.userId),
]);
CREATE UNIQUE INDEX
SQL CREATE UNIQUE INDEX文は、複数カラムの場合は複合ユニーク制約と同じ方法で、単一カラムの場合はカラムレベルの.unique()に変換されます:
CREATE UNIQUE INDEX idx_user_email ON users(email);
CREATE UNIQUE INDEX idx_team_member ON team_members(team_id, user_id);
非ユニークインデックス
通常の(非ユニーク)インデックスはindex()関数を使用します:
import { index, integer, pgTable, varchar } from "drizzle-orm/pg-core";
export const posts = pgTable("posts", {
id: serial("id").primaryKey(),
authorId: integer("author_id").notNull(),
category: varchar("category", { length: 50 }),
}, (table) => [
index("idx_posts_author").on(table.authorId),
]);
名前付き制約と無名制約
Drizzleのunique()とindex()はオプションの名前文字列を受け入れます。コンバーターは利用可能な場合は元のSQLから名前を生成し、そうでない場合はテーブル名から派生させます。
ユースケース
データベーススキーマが単一カラムと複合の両方のユニーク制約とクエリパフォーマンス用のインデックスを使用しており、Drizzle ORMスキーマで適切に表現されることを確認したい場合。