You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Prisma中定义自动生成特定格式的唯一字符串ID

在Prisma中生成带前缀的自增字符串ID

Prisma本身没有内置支持这种带前缀的自增字符串ID,但可以通过两种实用方案实现需求:

方案1:Prisma中间件+数据库自增字段

这种方案不依赖数据库特定特性,通用性强:

  1. 调整模型结构,新增一个自增数字字段作为ID生成的基础:
model Company {
  id                 String      @unique // 最终生成C00000001格式
  serialId           Int         @id @default(autoincrement()) // 数据库自增主键
  companyName        String      @unique
  companyDescription String
  createdAt          DateTime    @default(now())
  updatedAt          DateTime    @updatedAt
}
  1. 添加Prisma中间件,在创建记录时自动生成格式化ID:
// 在Prisma客户端初始化文件(如prisma/client.ts)中添加
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

prisma.$use(async (params, next) => {
  if (params.model === 'Company' && params.action === 'create') {
    // 先创建基础记录,获取自动生成的serialId
    const createdRecord = await next(params);
    // 生成带前缀的格式化ID
    const formattedId = `C${createdRecord.serialId.toString().padStart(8, '0')}`;
    // 更新记录的id字段
    return prisma.company.update({
      where: { serialId: createdRecord.serialId },
      data: { id: formattedId },
    });
  }
  return next(params);
});

export default prisma;

方案2:数据库生成列(推荐,性能更优)

如果你的数据库支持生成列(PostgreSQL 12+、MySQL 5.7+等),可以直接在数据库层面自动生成格式化ID:

  1. 调整Prisma模型:
model Company {
  id                 String      @unique @db.VarChar(10) // 固定长度适配C+8位数字
  serialId           Int         @id @default(autoincrement())
  companyName        String      @unique
  companyDescription String
  createdAt          DateTime    @default(now())
  updatedAt          DateTime    @updatedAt

  @@map("companies")
}
  1. 手动修改迁移SQL文件:
    运行npx prisma migrate dev --name add-formatted-id生成迁移文件,打开后替换为对应数据库的SQL:

PostgreSQL版本

CREATE TABLE "companies" (
    "serialId" SERIAL NOT NULL,
    "id" VARCHAR(10) GENERATED ALWAYS AS ('C' || lpad("serialId"::text, 8, '0')) STORED NOT NULL,
    "companyName" TEXT NOT NULL,
    "companyDescription" TEXT,
    "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updatedAt" TIMESTAMP(3) NOT NULL,

    CONSTRAINT "companies_pkey" PRIMARY KEY ("serialId"),
    CONSTRAINT "companies_id_key" UNIQUE ("id"),
    CONSTRAINT "companies_companyName_key" UNIQUE ("companyName")
);

MySQL版本

CREATE TABLE `companies` (
    `serialId` INT NOT NULL AUTO_INCREMENT,
    `id` VARCHAR(10) GENERATED ALWAYS AS (CONCAT('C', LPAD(`serialId`, 8, '0'))) STORED NOT NULL,
    `companyName` VARCHAR(255) NOT NULL,
    `companyDescription` TEXT,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,

    PRIMARY KEY (`serialId`),
    UNIQUE KEY `companies_id_key` (`id`),
    UNIQUE KEY `companies_companyName_key` (`companyName`)
);

执行迁移后,数据库会自动根据serialId生成C00000001格式的ID,创建记录时无需手动传入id或serialId。

内容的提问来源于stack exchange,提问作者Bablu Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:36:23