186 lines
7.3 KiB
SQL
186 lines
7.3 KiB
SQL
-- 从 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. 数据备份
|
||
- 在生产环境执行前务必备份原始数据
|
||
*/
|