-- ========================================================= -- 004: 计划记录改为按 user_id 关联(user_id = auth_users.id) -- 目标库:mys_info_test(正式库:mys_info,如需可改) -- 前置:plan_checkins 已有按 student_id 关联的旧数据 -- 注意:执行前请先备份 plan_checkins 表 -- ========================================================= -- 1) 新增 user_id 列 ALTER TABLE `plan_checkins` ADD COLUMN `user_id` BIGINT NULL DEFAULT NULL AFTER `id`; -- 2) 用 auth_users.id 按旧 student_id 回填历史记录的 user_id UPDATE `plan_checkins` r LEFT JOIN `auth_users` u ON u.`student_id` = r.`student_id` SET r.`user_id` = u.`id` WHERE r.`user_id` IS NULL; -- 3) 重写历史附件相对路径:attachments//... -> attachments//... UPDATE `plan_checkins` r JOIN `auth_users` u ON u.`student_id` = r.`student_id` SET r.`attachments` = REPLACE(r.`attachments`, CONCAT('attachments/', r.`student_id`, '/'), CONCAT('attachments/', u.`id`, '/')) WHERE r.`student_id` IS NOT NULL AND r.`user_id` IS NOT NULL; -- 4) 旧 student_id 允许为空;新代码只写 user_id ALTER TABLE `plan_checkins` MODIFY COLUMN `student_id` VARCHAR(64) NULL DEFAULT NULL; -- 5) 新增唯一键 (user_id, plan_type, period_key):同用户同周期 upsert ALTER TABLE `plan_checkins` ADD UNIQUE KEY `uk_plan_user_period` (`user_id`, `plan_type`, `period_key`); -- 6) 计划概览聚合索引改为按 user_id ALTER TABLE `plan_checkins` ADD INDEX `idx_plan_period_user` (`plan_type`, `period_key`, `user_id`); -- ========================================================= -- 以下为可选清理(按实际索引名执行) -- 7) 旧版 (student_id, plan_type, period_key) 唯一键确认不再使用后: -- ALTER TABLE `plan_checkins` DROP INDEX `uk_plan_student_period`; -- 8) 旧版展平索引确认不再使用后: -- ALTER TABLE `plan_checkins` DROP INDEX `idx_plan_period_student`; -- 9) 数据质量核查:有无 student_id 无对应用户、user_id 仍为空的历史记录: -- SELECT * FROM plan_checkins WHERE user_id IS NULL; -- =========================================================