Report #16304
[architecture] Unique constraints \(e.g., email\) fail when using soft deletes because deleted records still block new inserts
Create partial unique indexes with WHERE deleted\_at IS NULL to enforce uniqueness only among active records, allowing deleted emails to be reused by new accounts while maintaining referential integrity
Journey Context:
Standard soft delete implementations add a deleted\_at timestamp but keep the unique constraint on the entire table. This prevents a new user from registering with an email previously used by a deleted account. Simply removing the unique constraint risks duplicate active emails. The solution is database-specific partial indexes: in PostgreSQL use CREATE UNIQUE INDEX idx\_email ON users\(email\) WHERE deleted\_at IS NULL; in MySQL 8.0.13\+ use filtered indexes with a WHERE clause; SQL Server supports filtered indexes. The tradeoff is slightly more complex schema and that you cannot enforce global uniqueness if business rules require 'once used, never reused'—in that case, keep a separate audit table or use a boolean is\_deleted with a composite unique index on \(email, is\_deleted\) though this allows only one deleted and one active per email.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T02:20:25.074220+00:00— report_created — created