-- 从 member_user 迁移数据到 ak_users 的SQL脚本 -- 创建日期: 2025-06-23 -- 用途: 将智跑系统的用户数据迁移到新的ak_users表结构 -- ============================================================================= -- 1. 数据迁移前的准备工作 -- ============================================================================= -- 检查源表数据 SELECT COUNT(*) as total_member_users, COUNT(DISTINCT user_id) as unique_user_ids, COUNT(CASE WHEN deleted = true THEN 1 END) as deleted_users FROM public.member_user; -- 检查目标表当前数据 SELECT COUNT(*) as current_ak_users FROM public.ak_users; -- ============================================================================= -- 2. 数据迁移主脚本 -- ============================================================================= -- 插入数据到 ak_users 表 INSERT INTO public.ak_users ( id, -- 使用 member_user.user_id username, -- 使用 nickname 或 name email, -- 需要生成或使用手机号@domain password_hash, -- 使用 member_user.password gender, -- 转换 sex 字段 birthday, -- 转换 birthday 字段 height_cm, -- 默认为 NULL weight_kg, -- 默认为 NULL avatar_url, -- 使用 avatar 字段 region_id, -- 默认为 NULL(需要后续映射) school_id, -- 默认为 NULL(需要后续映射) grade_id, -- 默认为 NULL(需要后续映射) class_id, -- 默认为 NULL(需要后续映射) role, -- 默认为 'student' created_at, -- 使用 create_time updated_at, -- 使用 update_time auth_id, -- 使用 user_id(关联 users 表) preferred_language, -- 默认为 NULL bio, -- 使用 mark 字段 phone -- 使用 mobile 字段 ) SELECT mu.user_id, -- id COALESCE( -- username NULLIF(TRIM(mu.nickname), ''), NULLIF(TRIM(mu.name), ''), 'user_' || EXTRACT(EPOCH FROM mu.create_time)::bigint ), CASE -- email WHEN mu.mobile IS NOT NULL AND mu.mobile != '' AND mu.mobile != '''''' THEN mu.mobile || '@akmon.local' ELSE 'user_' || mu.id || '@akmon.local' END, CASE -- password_hash WHEN mu.password IS NOT NULL AND mu.password != '' THEN mu.password ELSE gen_random_uuid()::text END, CASE -- gender WHEN mu.sex = 1 THEN 'male' WHEN mu.sex = 2 THEN 'female' ELSE 'other' END, mu.birthday::date, -- birthday NULL, -- height_cm NULL, -- weight_kg CASE -- avatar_url WHEN mu.avatar IS NOT NULL AND mu.avatar != '' THEN mu.avatar ELSE NULL END, NULL, -- region_id NULL, -- school_id NULL, -- grade_id NULL, -- class_id 'student', -- role (默认为学生) mu.create_time AT TIME ZONE 'UTC', -- created_at mu.update_time AT TIME ZONE 'UTC', -- updated_at mu.user_id, -- auth_id NULL, -- preferred_language CASE -- bio WHEN mu.mark IS NOT NULL AND TRIM(mu.mark) != '' THEN mu.mark ELSE NULL END, CASE -- phone WHEN mu.mobile IS NOT NULL AND mu.mobile != '' AND mu.mobile != '''''' THEN mu.mobile ELSE NULL END FROM public.member_user mu WHERE mu.deleted = false -- 只迁移未删除的用户 AND mu.user_id IS NOT NULL -- 确保有有效的user_id AND NOT EXISTS ( -- 避免重复插入 SELECT 1 FROM public.ak_users au WHERE au.id = mu.user_id ); -- ============================================================================= -- 3. 数据迁移后的验证 -- ============================================================================= -- 验证迁移结果 SELECT 'Migration Summary' as check_type, COUNT(*) as migrated_users FROM public.ak_users au WHERE au.auth_id IS NOT NULL; -- 检查是否有重复的用户名 SELECT 'Username Duplicates' as check_type, username, COUNT(*) as duplicate_count FROM public.ak_users GROUP BY username HAVING COUNT(*) > 1; -- 检查是否有重复的邮箱 SELECT 'Email Duplicates' as check_type, email, COUNT(*) as duplicate_count FROM public.ak_users GROUP BY email HAVING COUNT(*) > 1; -- 检查迁移的完整性 SELECT 'Data Integrity Check' as check_type, COUNT(DISTINCT mu.user_id) as source_users, COUNT(DISTINCT au.id) as migrated_users, COUNT(DISTINCT mu.user_id) - COUNT(DISTINCT au.id) as missing_users FROM public.member_user mu LEFT JOIN public.ak_users au ON mu.user_id = au.id WHERE mu.deleted = false; -- ============================================================================= -- 4. 可选的清理和优化操作 -- ============================================================================= -- 更新序列(如果需要) -- SELECT setval('ak_users_id_seq', (SELECT MAX(id) FROM ak_users)); -- 分析表以优化查询性能 ANALYZE public.ak_users; -- ============================================================================= -- 5. 回滚脚本(如果需要) -- ============================================================================= -- 如果需要回滚迁移,可以使用以下脚本: /* -- 删除从 member_user 迁移过来的数据 DELETE FROM public.ak_users WHERE auth_id IN ( SELECT user_id FROM public.member_user WHERE deleted = false ); */ -- ============================================================================= -- 6. 后续处理建议 -- ============================================================================= /* 迁移完成后,建议进行以下操作: 1. 更新 region_id, school_id, grade_id, class_id 字段 - 根据业务逻辑映射到对应的新表 2. 设置用户角色 - 根据 member_user 的 group_id 或其他字段设置正确的角色 3. 处理用户偏好设置 - 如果有其他偏好数据需要迁移 4. 验证登录功能 - 确保用户可以使用新的认证系统登录 5. 数据备份 - 在生产环境执行前务必备份原始数据 */