Drizzleにおける主キーとSerialカラム

SQL PRIMARY KEY、SERIAL、BIGSERIAL、AUTO_INCREMENTカラムがDrizzle ORMのprimaryKeyチェーンとserialカラムビルダーにダイアレクト別にどのようにマッピングされるかを解説します。

Relations

詳細な説明

Drizzleにおける主キー

主キーはデータベーステーブルの最も基本的な制約です。Drizzleはカラム型やキーが単純か複合かに応じて、いくつかの定義方法を提供します。

SERIALを使用したシンプルな主キー

PostgreSQL:

CREATE TABLE users (
  id SERIAL PRIMARY KEY
);
import { pgTable, serial } from "drizzle-orm/pg-core";

export const users = pgTable("users", {
  id: serial("id").primaryKey(),
});

Drizzleのpg-coreのserial()ビルダーは、PostgreSQLのSERIAL型と同様に、暗黙的にカラムをNOT NULLかつ自動インクリメントにします。

MySQL AUTO_INCREMENT

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY
);
import { mysqlTable, serial } from "drizzle-orm/mysql-core";

export const users = mysqlTable("users", {
  id: serial("id").primaryKey(),
});

MySQLのserial()BIGINT UNSIGNED NOT NULL AUTO_INCREMENTにマッピングされます。

UUID主キー

CREATE TABLE documents (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY
);
import { pgTable, uuid } from "drizzle-orm/pg-core";
import { sql } from "drizzle-orm";

export const documents = pgTable("documents", {
  id: uuid("id").default(sql`gen_random_uuid()`).primaryKey(),
});

大規模テーブル用のBIGSERIAL

CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY
);
import { bigserial, pgTable } from "drizzle-orm/pg-core";

export const events = pgTable("events", {
  id: bigserial("id", { mode: "number" }).primaryKey(),
});

複合主キー

テーブルが複数カラムの主キーを持つ場合、個々のカラムは.primaryKey()取得しません。代わりに、テーブルの第3引数にprimaryKey()制約が追加されます:

import { integer, pgTable, primaryKey } from "drizzle-orm/pg-core";

export const postTags = pgTable("post_tags", {
  postId: integer("post_id").notNull(),
  tagId: integer("tag_id").notNull(),
}, (table) => [
  primaryKey({ columns: [table.postId, table.tagId] }),
]);

SQLiteの主キー

SQLiteでは、INTEGER PRIMARY KEYROWIDのエイリアスを作成し、デフォルトで自動インクリメントされます。AUTOINCREMENTキーワードはrowidの再利用を防ぐだけで、基本的な自動インクリメント動作には不要です。

ユースケース

異なる主キー戦略(serial、UUID、bigserial、複合)がSQLからDrizzle ORMにどのように変換されるかを、異なるデータベースダイアレクト間で理解する必要がある場合。

試してみる — SQL to Drizzle Schema

フルツールを開く