恢复了以下迁移文件到原始状态: - 004_add_redeem_code_notes.sql - 005_schema_parity.sql - 006_fix_invalid_subscription_expires_at.sql - 007_add_user_allowed_groups.sql - 008_seed_default_group.sql - 009_fix_usage_logs_cache_columns.sql - 010_add_usage_logs_aggregated_indexes.sql - 011_remove_duplicate_unique_indexes.sql - 012_add_user_subscription_soft_delete.sql - 013_log_orphan_allowed_groups.sql - 014_drop_legacy_allowed_groups.sql - 015_fix_settings_unique_constraint.sql - 016_soft_delete_partial_unique_indexes.sql - 018_user_attributes.sql - 019_migrate_wechat_to_attributes.sql - 024_add_gemini_tier_id.sql 数据库迁移文件不应在应用后修改,即使只是注释。
52 lines
2.2 KiB
SQL
52 lines
2.2 KiB
SQL
-- 016_soft_delete_partial_unique_indexes.sql
|
||
-- 修复软删除 + 唯一约束冲突问题
|
||
-- 将普通唯一约束替换为部分唯一索引(WHERE deleted_at IS NULL)
|
||
-- 这样软删除的记录不会占用唯一约束位置,允许删后重建同名/同邮箱/同订阅关系
|
||
|
||
-- ============================================================================
|
||
-- 1. users 表: email 字段
|
||
-- ============================================================================
|
||
|
||
-- 删除旧的唯一约束(可能的命名方式)
|
||
ALTER TABLE users DROP CONSTRAINT IF EXISTS users_email_key;
|
||
DROP INDEX IF EXISTS users_email_key;
|
||
DROP INDEX IF EXISTS user_email_key;
|
||
|
||
-- 创建部分唯一索引:只对未删除的记录建立唯一约束
|
||
CREATE UNIQUE INDEX IF NOT EXISTS users_email_unique_active
|
||
ON users(email)
|
||
WHERE deleted_at IS NULL;
|
||
|
||
-- ============================================================================
|
||
-- 2. groups 表: name 字段
|
||
-- ============================================================================
|
||
|
||
-- 删除旧的唯一约束
|
||
ALTER TABLE groups DROP CONSTRAINT IF EXISTS groups_name_key;
|
||
DROP INDEX IF EXISTS groups_name_key;
|
||
DROP INDEX IF EXISTS group_name_key;
|
||
|
||
-- 创建部分唯一索引
|
||
CREATE UNIQUE INDEX IF NOT EXISTS groups_name_unique_active
|
||
ON groups(name)
|
||
WHERE deleted_at IS NULL;
|
||
|
||
-- ============================================================================
|
||
-- 3. user_subscriptions 表: (user_id, group_id) 组合字段
|
||
-- ============================================================================
|
||
|
||
-- 删除旧的唯一约束/索引
|
||
ALTER TABLE user_subscriptions DROP CONSTRAINT IF EXISTS user_subscriptions_user_id_group_id_key;
|
||
DROP INDEX IF EXISTS user_subscriptions_user_id_group_id_key;
|
||
DROP INDEX IF EXISTS usersubscription_user_id_group_id;
|
||
|
||
-- 创建部分唯一索引
|
||
CREATE UNIQUE INDEX IF NOT EXISTS user_subscriptions_user_group_unique_active
|
||
ON user_subscriptions(user_id, group_id)
|
||
WHERE deleted_at IS NULL;
|
||
|
||
-- ============================================================================
|
||
-- 注意: api_keys 表的 key 字段保留普通唯一约束
|
||
-- API Key 即使软删除后也不应该重复使用(安全考虑)
|
||
-- ============================================================================
|