Prisma一对多关联失效求助:创建多产品触发唯一约束错误
问题描述
使用Prisma搭配Postgres实现一对多关联:一个User可拥有0个或多个Product。能为特定用户创建1个产品,但创建第二个时遇到错误:
Invalid prisma.product.create() invocation: Unique constraint failed on the fields: ('userEmail')
相关代码
schema.prisma
model Product { id String @id @default(cuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt name String description String? published Boolean @default(false) user User @relation(fields: [userEmail], references: [email]) userEmail String @unique productImageUrl String? } model User { id String @id @default(cuid()) name String? email String? @unique emailVerified DateTime? image String? active Boolean? products Product[] }
Next.js API路由
const Index = async (_req: NextApiRequest, res: NextApiResponse) => { const reqBody = _req.body ?? null; if (!reqBody) res.status(200).json({ message: "No request body found" }); const product = await prisma.product.create({ data: { user: { connect: { email: "xxx@x.com" // 该用户已存在于数据库中 }, }, published: true, name: "Test Product 3", createdAt: new Date, updatedAt: new Date, } }) res.status(200).json({ data: reqBody }) };
解决方案
问题根源是Product模型的userEmail字段被添加了@unique约束,这强制要求每个邮箱只能关联一个产品,完全违背了“一个用户拥有多个产品”的设计逻辑。
修复步骤:
- 修改
schema.prisma,移除Product模型中userEmail字段的@unique约束:
model Product { id String @id @default(cuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt name String description String? published Boolean @default(false) user User @relation(fields: [userEmail], references: [email]) userEmail String // 移除@unique约束 productImageUrl String? }
- 重新生成迁移文件:
npx prisma migrate dev --name remove-useremail-unique
- 执行迁移更新数据库结构:
运行上述命令后,按提示确认即可完成数据库变更。
完成后再次尝试为同一用户创建多个产品,就不会触发唯一约束错误了。
内容的提问来源于stack exchange,提问作者Doolan
相关产品推荐
相关产品推荐

