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スキーマで適切に表現されることを確認したい場合。

試してみる — SQL to Drizzle Schema

フルツールを開く