使用 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 来同步数据库。

参考链接

相关推荐
之歆14 分钟前
DAY12_CSS3选择器全攻略 + 盒子新特性完全指南(下)
前端·javascript·css3
用户91383817079915 分钟前
从乐观锁到悲观锁:一次库存并发问题的排查与重构
后端
kyriewen1116 分钟前
代码写成一锅粥?3个设计模式让你的项目“起死回生”
开发语言·前端·javascript·设计模式·ecmascript
donecoding18 分钟前
pnpm 全局包与 nvm 的真相:命令永在,运行时随缘
node.js·claude
光影少年21 分钟前
react函数组件、类组件、纯组件、受控/非受控组件
前端·react.js·掘金·金石计划
程序员包打听21 分钟前
MoonBit 是什么?给第一次听说这门语言的你
前端·后端
RuoyiOffice25 分钟前
2026 年开源 BPM/工作流引擎大盘点:Flowable vs Camunda vs Activiti vs Turbo——谁才是企业级首选?
java·spring boot·后端·开源·流程图·ruoyi·anti-design-vue
Rkgua28 分钟前
CSS动画效果
前端·css
SamDeepThinking30 分钟前
别把业务逻辑塞进存储过程,适当用表驱动法
java·后端·架构
只做人间不老仙32 分钟前
C++ grpc 截止时间示例学习
后端·grpc