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

参考链接

相关推荐
wuk9982 小时前
实现ROS系统的Websocket传输,向Web应用推送sensor_msgs::Image数据
前端·websocket·网络协议
hweiyu002 小时前
Go Fiber 简介
开发语言·后端·golang
合作小小程序员小小店4 小时前
web网页开发,在线%考试管理%系统,基于Idea,vscode,html,css,vue,java,maven,springboot,mysql
java·前端·系统架构·vue·intellij-idea·springboot
你的人类朋友4 小时前
😎 Node.js 应用多阶段构建 Dockerfile 详解
后端·docker·容器
天天进步20154 小时前
CSS Grid与Flexbox:2025年响应式布局终极指南
前端·css
小坏讲微服务5 小时前
Spring Boot整合Redis注解,实战Redis注解使用
spring boot·redis·分布式·后端·spring cloud·微服务·mybatis
Boop_wu5 小时前
[Java EE] 计算机基础
java·服务器·前端
橘子海全栈攻城狮5 小时前
【源码+文档+调试讲解】基于Spring Boot的考务管理系统设计与实现 085
java·spring boot·后端·spring
追逐时光者5 小时前
一个基于 .NET 8 + DDD 搭建的模块化微服务框架
后端·.net
William_cl5 小时前
C# ASP.NET MVC 数据验证实战:View 层双保险(Html.ValidationMessageFor + jQuery Validate)
后端·c#·asp.net·mvc