016_soft_delete_partial_unique_indexes.sql 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. -- 016_soft_delete_partial_unique_indexes.sql
  2. -- 修复软删除 + 唯一约束冲突问题
  3. -- 将普通唯一约束替换为部分唯一索引(WHERE deleted_at IS NULL)
  4. -- 这样软删除的记录不会占用唯一约束位置,允许删后重建同名/同邮箱/同订阅关系
  5. -- ============================================================================
  6. -- 1. users 表: email 字段
  7. -- ============================================================================
  8. -- 删除旧的唯一约束(可能的命名方式)
  9. ALTER TABLE users DROP CONSTRAINT IF EXISTS users_email_key;
  10. DROP INDEX IF EXISTS users_email_key;
  11. DROP INDEX IF EXISTS user_email_key;
  12. -- 创建部分唯一索引:只对未删除的记录建立唯一约束
  13. CREATE UNIQUE INDEX IF NOT EXISTS users_email_unique_active
  14. ON users(email)
  15. WHERE deleted_at IS NULL;
  16. -- ============================================================================
  17. -- 2. groups 表: name 字段
  18. -- ============================================================================
  19. -- 删除旧的唯一约束
  20. ALTER TABLE groups DROP CONSTRAINT IF EXISTS groups_name_key;
  21. DROP INDEX IF EXISTS groups_name_key;
  22. DROP INDEX IF EXISTS group_name_key;
  23. -- 创建部分唯一索引
  24. CREATE UNIQUE INDEX IF NOT EXISTS groups_name_unique_active
  25. ON groups(name)
  26. WHERE deleted_at IS NULL;
  27. -- ============================================================================
  28. -- 3. user_subscriptions 表: (user_id, group_id) 组合字段
  29. -- ============================================================================
  30. -- 删除旧的唯一约束/索引
  31. ALTER TABLE user_subscriptions DROP CONSTRAINT IF EXISTS user_subscriptions_user_id_group_id_key;
  32. DROP INDEX IF EXISTS user_subscriptions_user_id_group_id_key;
  33. DROP INDEX IF EXISTS usersubscription_user_id_group_id;
  34. -- 创建部分唯一索引
  35. CREATE UNIQUE INDEX IF NOT EXISTS user_subscriptions_user_group_unique_active
  36. ON user_subscriptions(user_id, group_id)
  37. WHERE deleted_at IS NULL;
  38. -- ============================================================================
  39. -- 注意: api_keys 表的 key 字段保留普通唯一约束
  40. -- API Key 即使软删除后也不应该重复使用(安全考虑)
  41. -- ============================================================================