Files
akmon/doc_zhipao/migrate_member_user_to_ak_users.sql
2026-01-20 08:04:15 +08:00

186 lines
7.3 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 从 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. 数据备份
- 在生产环境执行前务必备份原始数据
*/