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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:40:18