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

参考链接

相关推荐
寻月隐君1 分钟前
Rust 错误处理终极指南:从 panic! 到 Result 的优雅之道
后端·rust·github
野槐2 分钟前
vue3+node.js+mysql写接口(二)
node.js
AI转型之路6 分钟前
Dify 实现长文档自定义切片:高效处理大规模文档的智能解决方案
后端
前端的日常9 分钟前
以下代码,那一部分运行快
前端
GeGarron10 分钟前
Drawing:专注高效画图,让每一次创作都值得被珍藏
前端
梨子同志10 分钟前
Vue v-model 指令详解
前端·vue.js
杨进军10 分钟前
简易实现 React 页面初次渲染
前端·react.js·前端框架
血舞之境12 分钟前
同名类引发问题:没见过世面导致遇见各种诡异的问题
前端
杨进军12 分钟前
实现 React 多个原生标签子节点渲染
前端·react.js·前端框架
讨厌吃蛋黄酥13 分钟前
🚀 全栈开发48小时逆袭:用Node.js打造超炫实时数据仪表盘! 📊
node.js·全栈