| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- -- ============================================
- -- 用户实名认证功能 - 数据库迁移脚本
- -- 迁移文件: 051_add_user_verification_fields.sql
- -- 描述: 为用户表添加实名认证相关字段
- -- 数据库: PostgreSQL
- -- Schema: aigcspace
- -- ============================================
- -- 设置 schema
- SET search_path TO aigcspace;
- -- ============================================
- -- 正向迁移: 添加实名认证字段
- -- ============================================
- -- 1. 添加真实姓名字段
- ALTER TABLE aigcspace.users
- ADD COLUMN IF NOT EXISTS real_name VARCHAR(100);
- -- 2. 添加身份证号字段
- ALTER TABLE aigcspace.users
- ADD COLUMN IF NOT EXISTS id_card VARCHAR(18);
- -- 3. 添加认证状态字段
- ALTER TABLE aigcspace.users
- ADD COLUMN IF NOT EXISTS is_verified VARCHAR(20) NOT NULL DEFAULT 'unverified';
- -- 4. 添加认证通过时间字段
- ALTER TABLE aigcspace.users
- ADD COLUMN IF NOT EXISTS verified_at TIMESTAMP;
- -- ============================================
- -- 添加字段注释
- -- ============================================
- COMMENT ON COLUMN aigcspace.users.real_name IS '真实姓名';
- COMMENT ON COLUMN aigcspace.users.id_card IS '身份证号';
- COMMENT ON COLUMN aigcspace.users.is_verified IS '实名认证状态:unverified-未认证, pending-待审核, verified-已认证, rejected-已拒绝';
- COMMENT ON COLUMN aigcspace.users.verified_at IS '认证通过时间';
- -- ============================================
- -- 创建索引
- -- ============================================
- -- 为认证状态创建索引(用于筛选已认证/未认证用户)
- CREATE INDEX IF NOT EXISTS idx_users_is_verified ON aigcspace.users(is_verified);
- -- 为身份证号创建索引(用于查重和查询)
- CREATE INDEX IF NOT EXISTS idx_users_id_card ON aigcspace.users(id_card);
- -- ============================================
- -- 添加约束(可选)
- -- ============================================
- -- 为已认证用户的身份证号添加唯一约束(防止一个身份证号被多个用户使用)
- -- 注意:只对已认证的用户生效
- CREATE UNIQUE INDEX IF NOT EXISTS idx_users_id_card_verified_unique
- ON aigcspace.users(id_card)
- WHERE is_verified = 'verified' AND id_card IS NOT NULL;
- -- ============================================
- -- 数据迁移(可选)
- -- ============================================
- -- 将现有用户的认证状态设置为未认证
- UPDATE aigcspace.users
- SET is_verified = 'unverified'
- WHERE is_verified IS NULL;
- -- ============================================
- -- 回滚迁移(注释掉,需要时取消注释)
- -- ============================================
- -- 删除索引
- -- DROP INDEX IF EXISTS aigcspace.idx_users_id_card_verified_unique;
- -- DROP INDEX IF EXISTS aigcspace.idx_users_id_card;
- -- DROP INDEX IF EXISTS aigcspace.idx_users_is_verified;
- -- 删除字段
- -- ALTER TABLE aigcspace.users DROP COLUMN IF EXISTS verified_at;
- -- ALTER TABLE aigcspace.users DROP COLUMN IF EXISTS is_verified;
- -- ALTER TABLE aigcspace.users DROP COLUMN IF EXISTS id_card;
- -- ALTER TABLE aigcspace.users DROP COLUMN IF EXISTS real_name;
- -- ============================================
- -- 验证脚本
- -- ============================================
- -- 查看表结构
- -- \d aigcspace.users
- -- 查看新增字段
- -- SELECT column_name, data_type, is_nullable, column_default
- -- FROM information_schema.columns
- -- WHERE table_schema = 'aigcspace'
- -- AND table_name = 'users'
- -- AND column_name IN ('real_name', 'id_card', 'is_verified', 'verified_at');
- -- 查看索引
- -- SELECT indexname, indexdef
- -- FROM pg_indexes
- -- WHERE schemaname = 'aigcspace'
- -- AND tablename = 'users'
- -- AND indexname LIKE '%verified%';
- -- 统计认证状态分布
- -- SELECT is_verified, COUNT(*) as count
- -- FROM aigcspace.users
- -- GROUP BY is_verified;
- -- ============================================
- -- 完成
- -- ============================================
|