Prisma @default(autoincrement())からSQL SERIALとAUTO_INCREMENTへの変換
Prismaの@default(autoincrement())がPostgreSQLのSERIAL、MySQLのAUTO_INCREMENT、SQLiteのAUTOINCREMENTにどのようにマッピングされるかを理解します。
Field Types
詳細な説明
オートインクリメントのマッピング
Prismaの@default(autoincrement())は自動増分主キーを定義する標準的な方法です。各SQLダイアレクトでの処理方法は異なります。
ダイアレクト別の出力
| Prisma | PostgreSQL | MySQL | SQLite |
|---|---|---|---|
Int @id @default(autoincrement()) |
SERIAL PRIMARY KEY |
INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY |
INTEGER PRIMARY KEY AUTOINCREMENT |
BigInt @id @default(autoincrement()) |
BIGSERIAL PRIMARY KEY |
BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY |
INTEGER PRIMARY KEY AUTOINCREMENT |
Prismaスキーマの例
model Category {
id Int @id @default(autoincrement())
name String @unique
@@map("categories")
}
PostgreSQLの出力
CREATE TABLE categories (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL UNIQUE
);
PostgreSQLのSERIALはシーケンスに裏付けられたINTEGERカラムを作成する便利な型です。BIGSERIALはBIGINTに対して同じことを行います。
MySQLの出力
CREATE TABLE categories (
id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL UNIQUE
);
MySQLはカラム定義でAUTO_INCREMENTキーワードを使用します。テーブルごとに1つのカラムのみAUTO_INCREMENTにでき、インデックスが必要です。
SQLiteの出力
CREATE TABLE categories (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(255) NOT NULL UNIQUE
);
SQLiteのAUTOINCREMENTは、削除後でもrowidが以前に使用された値より常に大きくなることを保証します。これがないと、SQLiteは削除されたrowidを再利用する可能性があります。
主キー以外のオートインクリメント
一般的ではありませんが、Prismaでは技術的に非主キーフィールドに@default(autoincrement())を許可しています。PostgreSQLではこれもSERIALを生成します。MySQLではAUTO_INCREMENTが機能するためにカラムにインデックスが必要なので、手動でインデックスを追加する必要があるかもしれません。
ユースケース
Prismaベースのアプリケーションを新しいデータベースエンジンに移行する際に、自動増分IDがターゲットデータベースダイアレクトでどのように作成されるかを正確に理解する必要があります。