如何在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 }) }
关键说明
- 该约束的作用:
- 同一个
picklistId下,最多只能有一条defaultValue = true的记录,满足「唯一默认值」的需求 defaultValue = false的记录不受唯一约束限制,可添加任意多条非默认选项
- 同一个
- 注意事项:部分唯一索引需要你的数据库支持(如PostgreSQL、MySQL 8.0.13+、SQL Server等),若使用旧版本数据库,可考虑通过数据库触发器实现类似逻辑,但优先推荐上述方案。
内容的提问来源于stack exchange,提问作者Simagdo
相关产品推荐
相关产品推荐

