Working with Delete Operations

1. Deleting Single Record

await prisma.user.delete({ where: { id: 1 } });
AspectDetail
WhereUnique field
ErrorP2025 if missing

2. Deleting Multiple Records

const res = await prisma.session.deleteMany({
  where: { expiresAt: { lt: new Date() } }
});
AspectDetail
ReturnsCount of removed rows
CascadesRespect referential actions

3. Using Where Clause Filters

VariantFilter
deleteUnique
deleteManyArbitrary

4. Handling Cascade Deletes

ActionEffect
CascadeChildren removed automatically
RestrictThrows P2003 if dependents exist
ManualWrap deletes in $transaction

5. Implementing Soft Delete Pattern

await prisma.user.update({
  where: { id: 1 },
  data: { deletedAt: new Date() }
});
ComponentUse
SchemadeletedAt DateTime?
Read filterAlways add deletedAt: null
ExtensionApply via $extends for DRY

6. Understanding Hard vs Soft Delete

Hard Delete

  • Frees storage
  • Irrecoverable
  • Cascades easily
  • Best for ephemeral data

Soft Delete

  • Audit-friendly
  • Reversible
  • Requires query filters
  • Best for user/business data
AspectHardSoft
StorageReclaimedGrows
RecoveryNoneYes
await prisma.user.update({
  where: { id: 1 },
  data: { posts: { deleteMany: { published: false } } }
});
Nested OpUse
deleteSpecific row
deleteManyFiltered subset

8. Handling Delete Errors

CodeCause
P2025Record not found
P2003FK constraint blocks delete
P2014Required relation violation

9. Validating Before Delete

CheckStrategy
OwnershipFilter by userId in where
ExistenceUse deleteMany for idempotent ops
PermissionsAuthorize before issuing query

10. Restoring Soft Deleted Records

await prisma.user.update({
  where: { id: 1 },
  data: { deletedAt: null }
});
StepDetail
Reset flagSet deletedAt to null
Restore relationsCascade restore if business requires