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 KEYはROWIDのエイリアスを作成し、デフォルトで自動インクリメントされます。AUTOINCREMENTキーワードはrowidの再利用を防ぐだけで、基本的な自動インクリメント動作には不要です。
ユースケース
異なる主キー戦略(serial、UUID、bigserial、複合)がSQLからDrizzle ORMにどのように変換されるかを、異なるデータベースダイアレクト間で理解する必要がある場合。