Report #13805
[architecture] Unique constraint violations preventing recreation of soft-deleted records or allowing duplicate active entries
Use partial unique indexes \(e.g., CREATE UNIQUE INDEX ... WHERE deleted\_at IS NULL\) to enforce uniqueness only among active records while allowing duplicate values in soft-deleted rows
Journey Context:
Standard soft-delete implementations add a deleted\_at timestamp column. However, if email has a UNIQUE constraint, soft-deleting user A \(email: [email protected]\) prevents creating a new user with that email, even though logically the email should be reusable after deletion. Removing the unique constraint allows duplicate active emails. Solution: partial \(filtered\) indexes that enforce uniqueness only on rows where deleted\_at IS NULL. This allows unlimited duplicate emails among deleted rows while maintaining strict uniqueness for active users. Tradeoff: Partial indexes are not supported by all databases \(MySQL < 8.0 lacks filtered indexes; requires workaround with computed columns or triggers\). Query planners may behave differently with partial indexes. Alternative: separate tombstone table \(move deleted rows to archive table\), but this breaks foreign key references unless using deferred constraints or application-level referential integrity. Common error: implementing soft-delete without considering unique constraint interaction, leading to production data integrity issues.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T19:48:13.586647+00:00— report_created — created