Report #11229
[architecture] Soft-delete breaks unique constraints \(e.g., email uniqueness\)
Use a partial unique index that excludes soft-deleted rows: CREATE UNIQUE INDEX idx\_active\_email ON users\(email\) WHERE deleted\_at IS NULL. Do not include deleted\_at in a standard unique constraint, as multiple NULL values violate uniqueness in some DBs and prevent re-adding deleted records.
Journey Context:
Standard unique constraints on \(email, deleted\_at\) fail because SQL allows multiple NULLs \(in most DBs\) breaking uniqueness for active records, or conversely prevents re-adding a deleted email if NULL is treated distinctly. Partial indexes filter the index to only active rows, enforcing uniqueness only where it matters. Alternative is a 'deleted' boolean with a unique constraint on \(email, deleted\) plus a NULLable deleted\_at, but this complicates queries. Partial indexes are cleaner but require DB support \(PostgreSQL, SQL Server filtered indexes, MySQL 8.0.13\+ functional indexes with CASE\).
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T12:49:16.216397+00:00— report_created — created