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

如何在Prisma+NestJS中实现每个Picklist仅一个默认值、多个非默认值?

问题描述

我正在使用Prisma结合NestJS开发,定义了Picklist实体用于向前端提供选择列表,PicklistValues实体存储每个Picklist对应的选项值。需求是每个Picklist只能存在一个默认选项值,其余可添加多个非默认选项值,但目前每个Picklist只能添加两个选项值——一个默认值和一个非默认值。

相关实体代码如下:

Picklist 实体

model Picklist {
  id Int @id @default(autoincrement())

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  picklistName    String @db.VarChar(255)
  picklistApiName String @db.VarChar(255)

  picklistValues PicklistValues[]

  @@map("Picklists")
}

PicklistValues 实体

model PicklistValues {
  id Int @id @default(autoincrement())

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  value         String  @db.VarChar(255)
  apiName       String  @db.VarChar(255)
  defaultValue  Boolean
  inactiveValue Boolean

  picklistId Int

  picklist      Picklist @relation(fields: [picklistId], references: [id])

  @@unique([picklistId, defaultValue])
}

已知问题出在@@unique([picklistId, defaultValue])约束,但尚未找到修改方案。


解决方案

问题根源在于当前的组合唯一约束:@@unique([picklistId, defaultValue])会强制同一个Picklist下,defaultValue的每个布尔值(true/false)都只能出现一次,因此只能存一条默认(true)、一条非默认(false)的数据,不符合需求。

要实现「每个Picklist仅一个默认值,非默认值可多存」的要求,需要使用部分唯一索引(Partial Unique Index),仅当defaultValue为true时,约束picklistId的唯一性。

修改后的PicklistValues实体代码:

model PicklistValues {
  id Int @id @default(autoincrement())

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  value         String  @db.VarChar(255)
  apiName       String  @db.VarChar(255)
  defaultValue  Boolean
  inactiveValue Boolean

  picklistId Int

  picklist      Picklist @relation(fields: [picklistId], references: [id])

  // 仅当defaultValue为true时,picklistId必须唯一
  @@unique([picklistId], where: { defaultValue: true })
}

关键说明

  1. 该约束的作用:
    • 同一个picklistId下,最多只能有一条defaultValue = true的记录,满足「唯一默认值」的需求
    • defaultValue = false的记录不受唯一约束限制,可添加任意多条非默认选项
  2. 注意事项:部分唯一索引需要你的数据库支持(如PostgreSQL、MySQL 8.0.13+、SQL Server等),若使用旧版本数据库,可考虑通过数据库触发器实现类似逻辑,但优先推荐上述方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:25:25