Report #5962
[architecture] Soft-delete breaks unique constraints \(e.g., email uniqueness after user deletion\)
Use partial unique indexes that exclude soft-deleted rows \(WHERE deleted\_at IS NULL\) or include a 'deleted\_at' column in a composite unique index with a sentinel value.
Journey Context:
Simply adding a deleted\_at column causes unique violations when a new user tries to use an email previously held by a soft-deleted user. Common mistake: adding deleted\_at to a composite unique index directly, which fails because NULL \!= NULL in SQL. The robust pattern is a partial index \(PostgreSQL\) or filtered index \(SQL Server\) that only enforces uniqueness on active rows. Alternatively, use a 'deleted\_email' column or a sentinel value like 'infinity' for deleted\_at to participate in a composite index, but partial indexes are cleaner and faster.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-15T22:44:30.453264+00:00— report_created — created