Files
Django/migrate_user_to_gvsdsdk.sql

180 lines
6.1 KiB
SQL
Raw 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.
-- ============================================================
-- 用户表架构迁移脚本
-- 从旧 user_main 表迁移数据到新 User + user_sensitive_data 表
--
-- 执行顺序:
-- 1. 先执行 python manage.py migrate创建新表
-- 2. 再执行本 SQL 脚本(迁移数据)
-- 3. 最后删除旧表(确认无误后)
-- ============================================================
-- ============================================================
-- 第1步从 user_main 迁移数据到 User 表
-- ============================================================
-- User 表:核心身份字段
INSERT INTO `User` (
`UserUUID`,
`UserName`,
`UserPassword`,
`UserPositionStatus`,
`UserPersonalSignature`,
`UserEmail`,
`UserEmailVerify`,
`UserAccountLicense`,
`UserGender`,
`UserTele`,
`UserCreateTime`,
`UserLastLoginDate`,
`IsStaff`,
`IsSuperuser`,
`YonghuID`,
`UserAvatar`,
`UserType`
)
SELECT
UNHEX(REPLACE(UUID(), '-', '')), -- 生成 16 字节 UUID
COALESCE(yonghuid, openid), -- UserName = yonghuid 或 openid
COALESCE(password, ''), -- UserPassword
0, -- UserPositionStatus
'', -- UserPersonalSignature
'', -- UserEmail
0, -- UserEmailVerify
1, -- UserAccountLicense (启用)
-1, -- UserGender
phone, -- UserTele
create_time, -- UserCreateTime
COALESCE(last_login_time, create_time), -- UserLastLoginDate
CASE WHEN user_type = 'admin' THEN 1 ELSE 0 END, -- IsStaff
CASE WHEN user_type = 'admin' THEN 1 ELSE 0 END, -- IsSuperuser
yonghuid, -- YonghuID
COALESCE(avatar, 'a_long/morentouxiang.jpg'), -- UserAvatar
user_type -- UserType
FROM `user_main`
WHERE yonghuid IS NOT NULL AND yonghuid != '';
-- ============================================================
-- 第2步迁移敏感数据到 user_sensitive_data 表
-- ============================================================
INSERT INTO `user_sensitive_data` (
`UserUUID_id`,
`OpenID`,
`UnionID`,
`Password`,
`PhoneVerified`,
`Zhifu`,
`SKZhanghao`,
`IP`,
`create_time`,
`update_time`
)
SELECT
u.`UserUUID`,
um.openid,
um.unionid,
um.password,
um.shoujihao_renzheng,
um.zhifu,
um.skzhanghao,
um.ip,
um.create_time,
NOW()
FROM `user_main` um
JOIN `User` u ON u.`YonghuID` = um.yonghuid;
-- ============================================================
-- 第3步更新扩展表的外键引用
-- 扩展表user_dashou, user_shangjia 等)的 user_id 原来指向 user_main.id自增整数
-- 现在需要改为指向 User.UserUUID16字节二进制
-- ============================================================
-- user_boss
UPDATE `user_boss` ub
JOIN `user_main` um ON um.id = ub.user_id
JOIN `User` u ON u.`YonghuID` = um.yonghuid
SET ub.user_id = u.`UserUUID`;
-- user_dashou
UPDATE `user_dashou` ud
JOIN `user_main` um ON um.id = ud.user_id
JOIN `User` u ON u.`YonghuID` = um.yonghuid
SET ud.user_id = u.`UserUUID`;
-- user_shangjia
UPDATE `user_shangjia` us
JOIN `user_main` um ON um.id = us.user_id
JOIN `User` u ON u.`YonghuID` = um.yonghuid
SET us.user_id = u.`UserUUID`;
-- user_guanshi
UPDATE `user_guanshi` ug
JOIN `user_main` um ON um.id = ug.user_id
JOIN `User` u ON u.`YonghuID` = um.yonghuid
SET ug.user_id = u.`UserUUID`;
-- user_zuzhang
UPDATE `user_zuzhang` uz
JOIN `user_main` um ON um.id = uz.user_id
JOIN `User` u ON u.`YonghuID` = um.yonghuid
SET uz.user_id = u.`UserUUID`;
-- user_shenheguan
UPDATE `user_shenheguan` ush
JOIN `user_main` um ON um.id = ush.user_id
JOIN `User` u ON u.`YonghuID` = um.yonghuid
SET ush.user_id = u.`UserUUID`;
-- admin_profile
UPDATE `admin_profile` ap
JOIN `user_main` um ON um.id = ap.user_id
JOIN `User` u ON u.`YonghuID` = um.yonghuid
SET ap.user_id = u.`UserUUID`;
-- user_kefu
UPDATE `user_kefu` uk
JOIN `user_main` um ON um.id = uk.user_id
JOIN `User` u ON u.`YonghuID` = um.yonghuid
SET uk.user_id = u.`UserUUID`;
-- ============================================================
-- 第4步更新 yonghu_dianpu_bangding 表的 to_field 引用
-- 原来用 to_field='yonghuid' 关联 user_main.yonghuid
-- 现在用 to_field='YonghuID' 关联 User.YonghuID
-- 数据本身不需要变yonghuid 值相同),但需要确认列名
-- ============================================================
-- yonghu_dianpu_bangding 的 yonghu_id 列存储的是 yonghuid 字符串值
-- 新模型 to_field='YonghuID',列名变为 yonghu_idDjango 自动生成)
-- 如果旧列名也是 yonghu_id则数据不需要迁移
-- ============================================================
-- 第5步验证数据完整性
-- ============================================================
-- 验证 User 表行数 = user_main 表行数
SELECT 'User count' AS check_name, COUNT(*) AS cnt FROM `User`
UNION ALL
SELECT 'user_main count', COUNT(*) FROM `user_main`
UNION ALL
SELECT 'user_sensitive_data count', COUNT(*) FROM `user_sensitive_data`
UNION ALL
SELECT 'user_dashou count', COUNT(*) FROM `user_dashou`
UNION ALL
SELECT 'user_shangjia count', COUNT(*) FROM `user_shangjia`;
-- 验证所有扩展表的 user_id 都能匹配到 User 表
SELECT 'orphan user_dashou' AS check_name, COUNT(*) AS cnt
FROM `user_dashou` ud LEFT JOIN `User` u ON u.`UserUUID` = ud.user_id
WHERE u.`UserUUID` IS NULL
UNION ALL
SELECT 'orphan user_shangjia', COUNT(*)
FROM `user_shangjia` us LEFT JOIN `User` u ON u.`UserUUID` = us.user_id
WHERE u.`UserUUID` IS NULL;
-- ============================================================
-- 第6步确认无误后删除旧表手动执行
-- ============================================================
-- DROP TABLE IF EXISTS `user_main`;
-- 注意:删除前请确保所有数据已正确迁移!