-- ============================================================================= -- 将入学年份为 2026 或年级为 2026 的学生「是否住校」统一改为「是」 -- -- 目标表字段: -- xg_student_msg.is_boarder 0-否,1-是 -- xg_student_msg.enrollment_year / grade -- 同时兼容班级表 xg_class_msg.enrollment_year / grade(学生字段为空时以班级为准) -- -- 用法: -- mysql -h -u root -p hzdyjs_xg < docs/数据库脚本/2026-10-16-xg_student_msg-set-boarder-2026.sql -- -- 建议:先执行「一、预览」确认影响范围,再执行「二、更新」 -- ============================================================================= SET NAMES utf8mb4; -- ----------------------------------------------------------------------------- -- 一、预览:命中范围与当前住校分布 -- ----------------------------------------------------------------------------- SELECT '========== 1. 命中学生数量(含已是住校)==========' AS section; SELECT COUNT(*) AS match_total FROM xg_student_msg s LEFT JOIN xg_class_msg c ON c.deleted = 0 AND NULLIF(TRIM(s.class_id), '') IS NOT NULL AND c.id = CAST(NULLIF(TRIM(s.class_id), '') AS UNSIGNED) WHERE s.deleted = 0 AND ( s.enrollment_year = 2026 OR s.grade = '2026' OR c.enrollment_year = 2026 OR c.grade = '2026' ); SELECT '========== 2. 命中且尚未住校(将被更新)==========' AS section; SELECT COUNT(*) AS need_update_count FROM xg_student_msg s LEFT JOIN xg_class_msg c ON c.deleted = 0 AND NULLIF(TRIM(s.class_id), '') IS NOT NULL AND c.id = CAST(NULLIF(TRIM(s.class_id), '') AS UNSIGNED) WHERE s.deleted = 0 AND IFNULL(s.is_boarder, 0) <> 1 AND ( s.enrollment_year = 2026 OR s.grade = '2026' OR c.enrollment_year = 2026 OR c.grade = '2026' ); SELECT '========== 3. 命中明细(抽样核对)==========' AS section; SELECT s.id, s.student_no, s.name, s.enrollment_year AS student_enrollment_year, s.grade AS student_grade, c.enrollment_year AS class_enrollment_year, c.grade AS class_grade, s.is_boarder, s.class_name, s.college_name, s.student_status FROM xg_student_msg s LEFT JOIN xg_class_msg c ON c.deleted = 0 AND NULLIF(TRIM(s.class_id), '') IS NOT NULL AND c.id = CAST(NULLIF(TRIM(s.class_id), '') AS UNSIGNED) WHERE s.deleted = 0 AND ( s.enrollment_year = 2026 OR s.grade = '2026' OR c.enrollment_year = 2026 OR c.grade = '2026' ) ORDER BY s.enrollment_year, s.student_no LIMIT 200; -- ----------------------------------------------------------------------------- -- 二、更新:是否住校 -> 是(1) -- ----------------------------------------------------------------------------- START TRANSACTION; UPDATE xg_student_msg s LEFT JOIN xg_class_msg c ON c.deleted = 0 AND NULLIF(TRIM(s.class_id), '') IS NOT NULL AND c.id = CAST(NULLIF(TRIM(s.class_id), '') AS UNSIGNED) SET s.is_boarder = 1, s.update_time = NOW() WHERE s.deleted = 0 AND IFNULL(s.is_boarder, 0) <> 1 AND ( s.enrollment_year = 2026 OR s.grade = '2026' OR c.enrollment_year = 2026 OR c.grade = '2026' ); -- 核对更新结果(事务内) SELECT ROW_COUNT() AS updated_rows; SELECT COUNT(*) AS still_not_boarder FROM xg_student_msg s LEFT JOIN xg_class_msg c ON c.deleted = 0 AND NULLIF(TRIM(s.class_id), '') IS NOT NULL AND c.id = CAST(NULLIF(TRIM(s.class_id), '') AS UNSIGNED) WHERE s.deleted = 0 AND IFNULL(s.is_boarder, 0) <> 1 AND ( s.enrollment_year = 2026 OR s.grade = '2026' OR c.enrollment_year = 2026 OR c.grade = '2026' ); COMMIT; -- 可选:仅预览不更新时,把上面 TRANSACTION 整段注释掉,或改为 ROLLBACK