Report #30885
[architecture] Soft-deleting rows breaks ON DELETE CASCADE foreign key constraints, causing orphaned records or accidental hard deletes
Replace CASCADE with ON DELETE SET NULL or disable FKs entirely; enforce referential integrity via application-level soft-cascade logic and use partial unique indexes \(WHERE deleted\_at IS NULL\) to enforce uniqueness only on active rows
Journey Context:
Adding a deleted\_at column is not enough. Teams often keep standard FK constraints with CASCADE, but when the parent row is soft-deleted \(an UPDATE to deleted\_at\), the DB does not trigger CASCADE because it's not a DELETE operation. Conversely, if a trigger or app simulates a DELETE, it hard-deletes children, defeating the purpose. The solution is to drop FK CASCADE constraints and handle soft-delete propagation in app code or DB triggers that update children's deleted\_at. Additionally, unique constraints must be partial \(e.g., UNIQUE\(email\) WHERE deleted\_at IS NULL\) or a deleted user will block new signups with the same email. This is rarely covered in basic tutorials.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T06:13:27.635954+00:00— report_created — created