在Prisma中删除用户时,如何处理外键约束错误(一对多关系)?
我正在用Express + Prisma构建一个博客系统的API。
我有一个 User 模型和一个 Post 模型,它们之间是一对多关系(一个用户可以拥有多篇文章)。
当我尝试删除用户时:
await prisma.user.delete({
where: { id: userId },
});
我遇到了以下错误:
Foreign key constraint failed
在这种情况下,应该有哪些正确的处理方式?
在实际应用中,针对这种情况的最佳实践是什么?
解决方案
这真的取决于你希望对这些文章做什么。
文章也应该一起删除吗?添加级联删除(cascade)。Prisma会处理它:
@relation(fields: [authorId], references: [id], onDelete: Cascade)
需要保留还是重新分配文章?先在一个事务中删除它们:
await prisma.$transaction([
prisma.post.deleteMany({ where: { authorId: userId } }),
prisma.user.delete({ where: { id: userId } }),
]);
不想丢失数据?软删除。添加一个 deletedAt 列,在查询时将其过滤掉。没有外键错误,也没有数据丢失:
model User {
id Int @id @default(autoincrement())
name String
deletedAt DateTime?
posts Post[]
}
await prisma.user.update({
where: { id: userId },
data: { deletedAt: new Date() },
});
然后只要在查询时排除已删除的用户即可,例如 where: { deletedAt: null }。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。