如何在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
相关产品推荐
相关产品推荐

