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

如何使用Prisma在满足slug与userId双条件时删除数据库行?

如何用Prisma基于slug和userId双条件删除指定行?

你当前的代码无法生效的核心原因是:Prisma的delete操作要求where子句必须匹配唯一标识(主键或带有唯一约束的字段/字段组合)。你的Favorites模型仅将id设为主键,slug和userId的组合没有唯一约束,因此直接同时使用这两个字段作为删除条件会报错。

解决方案:添加复合唯一约束

要实现双条件删除,你需要先在数据库层面为slug和userId添加复合唯一约束,确保同一个用户对同一个slug仅能存在一条记录,同时让Prisma支持基于该组合的唯一筛选。

1. 更新Prisma Schema

修改你的Favorites模型,添加复合唯一约束:

model Favorites {
  id          Int     @id @default(autoincrement())
  slug        String  @db.VarChar(128)
  contentType String? @db.VarChar(128)
  userId      String
  user        User?   @relation(fields: [userId], references: [id])

  // 新增:slug与userId的组合唯一约束
  @@unique([slug, userId])
}

2. 执行数据库迁移

运行以下命令让约束生效:

npx prisma migrate dev --name add-unique-slug-userid

3. 修改删除代码

此时你可以通过复合唯一键的组合条件执行删除操作,Prisma会自动生成复合键的名称(格式为字段1_字段2):

const deleteFavorite = await prisma.favorites.delete({
  where: {
    slug_userId: {
      slug: slug,
      userId: userId,
    },
  },
});

补充说明

  • 添加复合唯一约束不仅能解决删除问题,还能避免业务上出现同一个用户重复收藏同一内容的情况,保证数据一致性。
  • 如果因特殊原因无法添加唯一约束,你可以使用deleteMany删除所有符合条件的记录,但这不符合你"仅删除一行"的需求,因此不推荐这种方式。

内容的提问来源于stack exchange,提问作者Mathias Riis Sorensen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 09:42:05