051_add_user_verification_fields.sql 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. -- ============================================
  2. -- 用户实名认证功能 - 数据库迁移脚本
  3. -- 迁移文件: 051_add_user_verification_fields.sql
  4. -- 描述: 为用户表添加实名认证相关字段
  5. -- 数据库: PostgreSQL
  6. -- Schema: aigcspace
  7. -- ============================================
  8. -- 设置 schema
  9. SET search_path TO aigcspace;
  10. -- ============================================
  11. -- 正向迁移: 添加实名认证字段
  12. -- ============================================
  13. -- 1. 添加真实姓名字段
  14. ALTER TABLE aigcspace.users
  15. ADD COLUMN IF NOT EXISTS real_name VARCHAR(100);
  16. -- 2. 添加身份证号字段
  17. ALTER TABLE aigcspace.users
  18. ADD COLUMN IF NOT EXISTS id_card VARCHAR(18);
  19. -- 3. 添加认证状态字段
  20. ALTER TABLE aigcspace.users
  21. ADD COLUMN IF NOT EXISTS is_verified VARCHAR(20) NOT NULL DEFAULT 'unverified';
  22. -- 4. 添加认证通过时间字段
  23. ALTER TABLE aigcspace.users
  24. ADD COLUMN IF NOT EXISTS verified_at TIMESTAMP;
  25. -- ============================================
  26. -- 添加字段注释
  27. -- ============================================
  28. COMMENT ON COLUMN aigcspace.users.real_name IS '真实姓名';
  29. COMMENT ON COLUMN aigcspace.users.id_card IS '身份证号';
  30. COMMENT ON COLUMN aigcspace.users.is_verified IS '实名认证状态:unverified-未认证, pending-待审核, verified-已认证, rejected-已拒绝';
  31. COMMENT ON COLUMN aigcspace.users.verified_at IS '认证通过时间';
  32. -- ============================================
  33. -- 创建索引
  34. -- ============================================
  35. -- 为认证状态创建索引(用于筛选已认证/未认证用户)
  36. CREATE INDEX IF NOT EXISTS idx_users_is_verified ON aigcspace.users(is_verified);
  37. -- 为身份证号创建索引(用于查重和查询)
  38. CREATE INDEX IF NOT EXISTS idx_users_id_card ON aigcspace.users(id_card);
  39. -- ============================================
  40. -- 添加约束(可选)
  41. -- ============================================
  42. -- 为已认证用户的身份证号添加唯一约束(防止一个身份证号被多个用户使用)
  43. -- 注意:只对已认证的用户生效
  44. CREATE UNIQUE INDEX IF NOT EXISTS idx_users_id_card_verified_unique
  45. ON aigcspace.users(id_card)
  46. WHERE is_verified = 'verified' AND id_card IS NOT NULL;
  47. -- ============================================
  48. -- 数据迁移(可选)
  49. -- ============================================
  50. -- 将现有用户的认证状态设置为未认证
  51. UPDATE aigcspace.users
  52. SET is_verified = 'unverified'
  53. WHERE is_verified IS NULL;
  54. -- ============================================
  55. -- 回滚迁移(注释掉,需要时取消注释)
  56. -- ============================================
  57. -- 删除索引
  58. -- DROP INDEX IF EXISTS aigcspace.idx_users_id_card_verified_unique;
  59. -- DROP INDEX IF EXISTS aigcspace.idx_users_id_card;
  60. -- DROP INDEX IF EXISTS aigcspace.idx_users_is_verified;
  61. -- 删除字段
  62. -- ALTER TABLE aigcspace.users DROP COLUMN IF EXISTS verified_at;
  63. -- ALTER TABLE aigcspace.users DROP COLUMN IF EXISTS is_verified;
  64. -- ALTER TABLE aigcspace.users DROP COLUMN IF EXISTS id_card;
  65. -- ALTER TABLE aigcspace.users DROP COLUMN IF EXISTS real_name;
  66. -- ============================================
  67. -- 验证脚本
  68. -- ============================================
  69. -- 查看表结构
  70. -- \d aigcspace.users
  71. -- 查看新增字段
  72. -- SELECT column_name, data_type, is_nullable, column_default
  73. -- FROM information_schema.columns
  74. -- WHERE table_schema = 'aigcspace'
  75. -- AND table_name = 'users'
  76. -- AND column_name IN ('real_name', 'id_card', 'is_verified', 'verified_at');
  77. -- 查看索引
  78. -- SELECT indexname, indexdef
  79. -- FROM pg_indexes
  80. -- WHERE schemaname = 'aigcspace'
  81. -- AND tablename = 'users'
  82. -- AND indexname LIKE '%verified%';
  83. -- 统计认证状态分布
  84. -- SELECT is_verified, COUNT(*) as count
  85. -- FROM aigcspace.users
  86. -- GROUP BY is_verified;
  87. -- ============================================
  88. -- 完成
  89. -- ============================================