120 lines
4.4 KiB
SQL
120 lines
4.4 KiB
SQL
-- ===============================================================================
|
||
-- sys_user表增加org_id和org_name字段的数据库迁移脚本
|
||
-- 执行时间:预计2-5分钟(取决于数据量)
|
||
-- ===============================================================================
|
||
|
||
-- 第一步:添加字段到sys_user表
|
||
ALTER TABLE sys_user
|
||
ADD COLUMN org_id BIGINT NULL COMMENT '组织ID,直接关联sys_org_info.id',
|
||
ADD COLUMN org_name VARCHAR(100) NULL COMMENT '组织名称,冗余字段用于快速查询';
|
||
|
||
-- 第二步:创建索引以优化查询性能
|
||
CREATE INDEX idx_sys_user_org_id ON sys_user(org_id);
|
||
CREATE INDEX idx_sys_user_customer_org ON sys_user(customer_id, org_id);
|
||
CREATE INDEX idx_sys_user_customer_org_status ON sys_user(customer_id, org_id, status, is_deleted);
|
||
|
||
-- 第三步:数据迁移 - 从sys_user_org关联表同步数据到sys_user表
|
||
-- 注意:这里假设关联表名为sys_user_org和组织表名为sys_org_info
|
||
-- 请根据实际表名调整
|
||
|
||
-- 3.1 迁移策略1:直接从用户-组织关联表迁移(适用于有sys_user_org关联表的情况)
|
||
UPDATE sys_user u
|
||
INNER JOIN (
|
||
SELECT
|
||
uo.user_id,
|
||
uo.org_id,
|
||
COALESCE(o.name, oi.name) as org_name
|
||
FROM sys_user_org uo
|
||
LEFT JOIN sys_org_info o ON uo.org_id = o.id AND o.is_deleted = 0
|
||
LEFT JOIN sys_org_units oi ON uo.org_id = oi.id AND oi.is_deleted = 0
|
||
WHERE uo.is_deleted = 0
|
||
) org_data ON u.id = org_data.user_id
|
||
SET
|
||
u.org_id = org_data.org_id,
|
||
u.org_name = org_data.org_name
|
||
WHERE u.is_deleted = 0;
|
||
|
||
-- 3.2 迁移策略2:如果没有关联表,通过其他方式确定用户的组织归属
|
||
-- 例如:通过设备信息、部门编码等推导组织关系
|
||
-- UPDATE sys_user u
|
||
-- INNER JOIN t_device_info d ON u.device_sn = d.serial_number
|
||
-- INNER JOIN sys_org_info o ON d.dept_id = o.id
|
||
-- SET u.org_id = o.id, u.org_name = o.name
|
||
-- WHERE u.is_deleted = 0 AND d.is_deleted = 0 AND o.is_deleted = 0;
|
||
|
||
-- 第四步:数据完整性检查
|
||
-- 检查迁移结果统计
|
||
SELECT
|
||
COUNT(*) as total_users,
|
||
COUNT(org_id) as users_with_org_id,
|
||
COUNT(org_name) as users_with_org_name,
|
||
ROUND(COUNT(org_id) * 100.0 / COUNT(*), 2) as coverage_percentage
|
||
FROM sys_user
|
||
WHERE is_deleted = 0;
|
||
|
||
-- 检查组织分布
|
||
SELECT
|
||
org_name,
|
||
COUNT(*) as user_count
|
||
FROM sys_user
|
||
WHERE is_deleted = 0 AND org_name IS NOT NULL
|
||
GROUP BY org_name
|
||
ORDER BY user_count DESC;
|
||
|
||
-- 第五步:清理和优化(可选)
|
||
-- 清理空白的组织名称
|
||
UPDATE sys_user
|
||
SET org_name = '未分配'
|
||
WHERE is_deleted = 0 AND (org_name IS NULL OR org_name = '');
|
||
|
||
-- 更新表统计信息以优化查询性能
|
||
ANALYZE TABLE sys_user;
|
||
|
||
-- ===============================================================================
|
||
-- 回滚脚本(如果需要撤销更改)
|
||
-- ===============================================================================
|
||
|
||
-- 警告:执行回滚前请确保数据已备份
|
||
-- DROP INDEX IF EXISTS idx_sys_user_org_id;
|
||
-- DROP INDEX IF EXISTS idx_sys_user_customer_org;
|
||
-- DROP INDEX IF EXISTS idx_sys_user_customer_org_status;
|
||
-- ALTER TABLE sys_user DROP COLUMN org_id, DROP COLUMN org_name;
|
||
|
||
-- ===============================================================================
|
||
-- 验证脚本
|
||
-- ===============================================================================
|
||
|
||
-- 验证数据一致性:检查用户表的org_name与组织表的name是否一致
|
||
SELECT
|
||
u.id as user_id,
|
||
u.user_name,
|
||
u.org_id,
|
||
u.org_name as user_org_name,
|
||
COALESCE(o.name, oi.name) as actual_org_name,
|
||
CASE
|
||
WHEN u.org_name = COALESCE(o.name, oi.name) THEN 'MATCH'
|
||
ELSE 'MISMATCH'
|
||
END as status
|
||
FROM sys_user u
|
||
LEFT JOIN sys_org_info o ON u.org_id = o.id AND o.is_deleted = 0
|
||
LEFT JOIN sys_org_units oi ON u.org_id = oi.id AND oi.is_deleted = 0
|
||
WHERE u.is_deleted = 0 AND u.org_id IS NOT NULL
|
||
HAVING status = 'MISMATCH'
|
||
LIMIT 10;
|
||
|
||
-- 性能测试查询:验证优化效果
|
||
-- 优化前的查询(需要JOIN)
|
||
EXPLAIN SELECT
|
||
u.user_name,
|
||
o.name as org_name
|
||
FROM sys_user u
|
||
LEFT JOIN sys_user_org uo ON u.id = uo.user_id AND uo.is_deleted = 0
|
||
LEFT JOIN sys_org_info o ON uo.org_id = o.id AND o.is_deleted = 0
|
||
WHERE u.customer_id = 1939964806110937090 AND u.is_deleted = 0;
|
||
|
||
-- 优化后的查询(单表查询)
|
||
EXPLAIN SELECT
|
||
u.user_name,
|
||
u.org_name
|
||
FROM sys_user u
|
||
WHERE u.customer_id = 1939964806110937090 AND u.is_deleted = 0; |