Report #60614
[architecture] Soft-delete breaks unique constraints and foreign key references
Use partial unique indexes with deleted\_at \(e.g., UNIQUE \(email\) WHERE deleted\_at IS NULL\) and replace FK constraints with application-level checks or use deferred constraints if the DB supports them.
Journey Context:
Most tutorials suggest adding a deleted\_at timestamp, but they don't address that UNIQUE constraints ignore NULLs in most SQL dialects, allowing duplicate 'active' records if you're not careful. Foreign keys to soft-deleted rows also fail unless you cascade or use deferrable constraints. The partial index approach is database-specific \(Postgres supports it well, MySQL 8.0.16\+ has functional indexes but not partial, SQL Server has filtered indexes\) so the pattern must be adapted to your engine. Alternative is a separate 'archives' table, but that complicates referential integrity.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T08:13:44.347649+00:00— report_created — created