Prisma Like表唯一约束失效(P2002)问题求助
问题解决:Prisma点赞表唯一约束冲突及Schema优化
首先,你遇到的P2002错误是因为数据库中已经存在同一用户重复点赞同一条评论的记录,导致新增的唯一约束Like_commentId_LikerId_key无法生效。另外你的Schema存在不少冗余约束和关系引用,会加重维护负担,下面是分步解决方案:
1. 清理数据库中的重复点赞记录
先手动删除数据库里的重复数据(以PostgreSQL为例,其他数据库语法类似):
DELETE FROM "Like" WHERE idLikes NOT IN ( SELECT MIN(idLikes) FROM "Like" GROUP BY commentId, LikerId );
这段SQL会保留每个用户对每条评论的第一条点赞记录,删除后续重复的。
2. 优化Prisma Schema(简化约束+修复关系)
修改后的Schema如下,去掉了冗余约束,并用联合主键替代单独的唯一约束,更简洁地实现“用户-评论”唯一点赞:
model User { idUser Int @id @default(autoincrement()) pseudo String @unique @db.VarChar(100) password String @db.VarChar(255) role Role @default(USER) nom String @db.VarChar(100) prenom String @db.VarChar(100) email String @unique @db.VarChar(100) info_email String @default("null") @db.VarChar(200) writtenComments Comment[] likes Like[] } model Comment { idComment Int @id @default(autoincrement()) title String @db.VarChar(100) comment String @db.VarChar(200) author User @relation(fields: [authorId], references: [idUser], onDelete: Cascade) authorId Int likes Like[] } model Like { user User @relation(fields: [userId], references: [idUser], onDelete: Cascade) userId Int comment Comment @relation(fields: [commentId], references: [idComment], onDelete: Cascade) commentId Int @@id([userId, commentId]) // 联合主键直接保证用户-评论组合唯一,无需额外唯一约束 } enum Role { USER ADMIN }
核心修改点说明:
- 删掉了
User和Comment表中冗余的联合唯一约束:主键本身已经是唯一标识,和其他字段的联合约束完全没必要。 - 简化了关系引用:比如
Comment的author关系只需要关联User的主键idUser,不需要同时绑定pseudo;Like表同样只关联用户和评论的主键,避免冗余字段。 - 用联合主键替代单独的
idLikes和唯一约束:@@id([userId, commentId])直接让“用户ID+评论ID”成为点赞表的主键,天然保证一个用户只能给一条评论点一次赞,逻辑更清晰。
3. 应用Schema变更
执行Prisma迁移命令,让修改生效:
prisma migrate dev
之后你的点赞逻辑就会正常限制重复点赞,不会再出现唯一约束冲突的问题。
内容的提问来源于stack exchange,提问作者Amélie K.
相关产品推荐
相关产品推荐

