Report #91855
[architecture] Soft-deleted records violate unique constraints \(e.g., email, slug uniqueness\)
Create partial unique indexes that exclude soft-deleted rows using a WHERE clause \(e.g., WHERE deleted\_at IS NULL\), rather than standard unique constraints on the column alone.
Journey Context:
Standard soft-delete implementations add a deleted\_at timestamp, but unique constraints on business keys \(email, slug\) fail when a deleted record holds that value. Using a compound unique index on \(email, deleted\_at\) fails because SQL treats NULL as unequal to NULL, allowing multiple active records with the same email if deleted\_at is NULL. The robust solution is database-specific partial indexing: PostgreSQL supports CREATE UNIQUE INDEX ... WHERE deleted\_at IS NULL; MySQL 8.0.13\+ supports functional index filters similarly. This preserves referential integrity for active records while ignoring deleted ones. Alternative \(worse\): Use a sentinel value like 'infinity' for active records, but this complicates queries and loses NULL semantics.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T12:46:10.699484+00:00— report_created — created