Prisma模型中如何实现单产品内尺码唯一而非全局唯一?
如何在Prisma中实现按产品维度的尺码唯一约束(PostgreSQL)
当然可以通过数据库建模实现,完全不用手动校验,用PostgreSQL的联合唯一约束就能搞定,具体操作如下:
1. 修改Prisma Schema,添加联合唯一约束
假设你的尺码表名为ProductSize,需要给productId和size字段设置联合唯一约束,确保同一个产品下的尺码唯一,不同产品则可以使用相同尺码。
完整的模型示例:
model Product { id Int @id @default(autoincrement()) name String sizes ProductSize[] // 产品与尺码的一对多关联 } model ProductSize { id Int @id @default(autoincrement()) productId Int size String // 替换成你实际使用的类型,比如Int product Product @relation(fields: [productId], references: [id], onDelete: Cascade) // 核心配置:联合唯一约束,绑定productId和size @@unique([productId, size]) }
注意:如果之前给size字段单独加了@unique全局唯一约束,必须删掉它,否则依然会限制所有产品的尺码不能重复。
2. 执行数据库迁移让约束生效
运行以下命令生成并应用迁移文件:
npx prisma migrate dev
PostgreSQL会自动创建联合唯一索引,之后不管是通过Prisma客户端操作,还是直接修改数据库,只要同一个产品下重复添加尺码,都会触发数据库的唯一约束错误,Prisma会自动抛出该错误,你只需捕获处理即可,无需手动编写校验逻辑。
这种数据库层面的约束比应用层校验更可靠,能避免并发场景下的竞态问题(比如两个请求同时给同一个产品添加同一尺码,应用层校验可能同时通过,但数据库会直接拦截)。
内容的提问来源于stack exchange,提问作者Fusion Developers
相关产品推荐
相关产品推荐

