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がターゲットデータベースダイアレクトでどのように作成されるかを正確に理解する必要があります。

試してみる — Prisma to SQL Schema

フルツールを開く