使用 Prisma 删除关联记录

使用 Prisma 这个 ORM 删除记录时会遇到存在关联记录的情况。一般的做法是同时删除关联的记录,可以保证数据的完整、避免冗余数据。

本文介绍使用 Prisma 删除记录时如何同时删除关联记录。

方案一:使用事务

使用两次 SQL 任务来执行删除,可以删除指定的记录和关联的记录。这里我们使用事务可以保证所有 SQL 都一起执行成功,避免只删除其中某一项。

typescript 复制代码
const deletePosts = prisma.post.deleteMany({
  where: {
    authorId: 7,
  },
})

const deleteUser = prisma.user.delete({
  where: {
    id: 7,
  },
})

const transaction = await prisma.$transaction([deletePosts, deleteUser])

方案二:使用 Referential actions

Referential actionsPrisma2.26.0 版本之后提供的一个功能,可以在 schema.prisma 中定义更新或者删除记录时关联的记录需要执行的操作。

用法如下,在 schema.prisma 中定义 onDelete 需要执行什么操作。除了 Cascade 同时删除关联记录,还有其他选项 Restrict, NoAction, SetNull, SetDefault

diff 复制代码
model Post {
  id       Int    @id @default(autoincrement())
  title    String
++  author   User   @relation(fields: [authorId], references: [id], onDelete: Cascade)
--  author   User   @relation(fields: [authorId], references: [id])
  authorId Int
}

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

需要注意,更新 schema 之后需要执行 npx prisma migrate dev 来生成数据库迁移记录或者 npx prisma db push 来同步数据库。

参考链接

相关推荐
Penge66616 小时前
Go 接口编译期断言
后端
我是一颗柠檬17 小时前
【MySQL全面教学】MySQL面试高频考点汇总Day15(2026年)
数据库·后端·mysql·面试
拽着尾巴的鱼儿17 小时前
springboot openfeign 自定义feign 接口重试机制
java·spring boot·后端
kyriewen17 小时前
微软用Go重写TypeScript编译器,速度提升10倍,网友:这是“背叛”还是“救赎”?
前端·typescript·ecmascript 6
Ceelog17 小时前
久坐党自救指南:屏幕前 8 小时,身体到底在经历什么
前端·后端
西陵18 小时前
Agent 为什么会陷入 Doom Loop?OpenClaw 的破解之道
前端·人工智能·ai编程
Hyyy18 小时前
普通前端续命周报——第2周
前端
wuxinyan12318 小时前
工业级大模型学习之路030:Streamlit 企业级智能体前端工作台
前端·学习·streamlit·智能体
XS03010618 小时前
并发编程 六
java·后端
修己xj18 小时前
告别无效刷屏!TrendRadar:最快30秒部署的开源热点助手,让你只看真正关心的新闻
前端