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

如何在Prisma中仅删除无其他表关联的行?

在Prisma中删除未关联其他表的行

要实现仅删除未与任何其他表建立关联的行,需根据关联类型(当前表含可选外键、其他表关联当前表)选择对应的查询条件,以下是具体场景和实现代码:

场景1:当前表包含可选外键字段

假设你的表(如Post)有一个可选外键(如authorId)关联到另一张表(如User),要删除没有关联User的Post行,直接通过判断外键字段为null即可:

Prisma Schema 示例

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  authorId  Int?     // 可选外键,关联User表
  author    User?    @relation(fields: [authorId], references: [id])
}

model User {
  id    Int    @id @default(autoincrement())
  name  String
  posts Post[]
}

删除操作代码

// 删除未关联User的Post
await prisma.post.deleteMany({
  where: {
    authorId: null,
  },
});

场景2:其他表关联当前表(一对多/多对多)

如果是其他表(如Comment)通过外键关联到当前表(如Post),要删除没有任何关联Comment的Post,需使用Prisma的none关联查询操作符:

Prisma Schema 示例(一对多)

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  comments  Comment[] // 一对多关联Comment表
}

model Comment {
  id      Int    @id @default(autoincrement())
  content String
  postId  Int
  post    Post   @relation(fields: [postId], references: [id])
}

删除操作代码

// 删除未关联任何Comment的Post
await prisma.post.deleteMany({
  where: {
    comments: {
      none: {},
    },
  },
});

多对多关联场景示例

如果是多对多关联(如Post与Tag),同样使用none操作符筛选无关联的行:

Prisma Schema 示例

model Post {
  id    Int    @id @default(autoincrement())
  title String
  tags  Tag[]  @relation("PostTag")
}

model Tag {
  id    Int    @id @default(autoincrement())
  name  String
  posts Post[] @relation("PostTag")
}

删除操作代码

// 删除未关联任何Tag的Post
await prisma.post.deleteMany({
  where: {
    tags: { none: {} },
  },
});

场景3:组合多种关联条件

如果需要同时满足多个无关联条件(如既没有关联User也没有关联Comment),可以用AND组合多个筛选条件:

await prisma.post.deleteMany({
  where: {
    AND: [
      { authorId: null },
      { comments: { none: {} } },
    ],
  },
});

内容的提问来源于stack exchange,提问作者code_optimizer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 09:57:13