如何在schema.prisma中为PostgreSQL配置ID自增
问题根因
当前Prisma模型的ID字段使用@default(cuid())配置,生成的是全局唯一随机字符串作为主键,属于字符串类型主键方案,不会触发PostgreSQL的自增序列逻辑,因此不符合ID自增的需求。你参考的模板默认采用的就是这套字符串ID设计,本身没有配置数据库自增规则。
当前运行效果参考:
配置实现PostgreSQL自增ID
标准实现方案(推荐)
直接使用Prisma提供的autoincrement()默认值规则,映射PostgreSQL原生的自增列能力,需要把ID字段类型从String改为Int,修改后的User模型代码如下:
model User { id Int @id @default(autoincrement()) name String? email String? @unique emailVerified DateTime? @map("email_verified") image String? createdAt DateTime @default(now()) @map(name: "created_at") updatedAt DateTime @updatedAt @map(name: "updated_at") posts Post[] accounts Account[] sessions Session[] @@map(name: "users") }
特殊场景方案(需保留String类型ID时使用)
如果因为历史关联、业务要求必须保留String类型的ID字段,需要先在PostgreSQL中手动创建自增序列,再通过dbgenerated()绑定序列默认值,该方案维护成本更高,非必要不选用。
配置生效步骤
修改完模型文件后,需要执行以下操作让配置同步到数据库:
- 开发环境下,直接执行
npx prisma db push将结构变更推送到数据库,再执行npx prisma generate更新本地Prisma客户端即可 - 生产环境下,建议通过迁移命令生成可回溯的迁移脚本:
npx prisma migrate dev --name set_user_id_autoincrement,确认脚本逻辑无误后再在生产库执行
注意:如果users表中已经存在存量数据,直接修改ID字段类型会触发数据库报错,需要先清空表数据,或者手动编写迁移脚本完成存量ID的格式转换,再执行结构同步。
内容的提问来源于stack exchange,提问作者lian. lun
相关产品推荐
相关产品推荐

