-- ============================================================================== -- RailwaySystem 数据库 V2 增量脚本: 020_add_checkin_student_id.sql -- 目标: 为 train_student_checkin 增加 student_id (VARCHAR(32)) -- 把学员维度从 enrollment 关系下沉为考勤行本身的冗余列,按学员检索考勤时 -- 无需再 join train_enrollment,同时保留 enrollment_id 作为业务唯一键。 -- 适用数据库: KingbaseES V009R003C018 / PostgreSQL (schema: public) -- 幂等性: 通过 information_schema 判断列是否已存在,可重复执行 -- 关联变更: 004/006 基线同步、010 校验规则调整、Mapper/Domain/DTO/Service 同步 -- ============================================================================== BEGIN; -- 步骤 1: 新增列 (可为空,先加列再回填,避免已有数据阻塞) DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'train_student_checkin' AND column_name = 'student_id' ) THEN ALTER TABLE train_student_checkin ADD COLUMN student_id VARCHAR(32); END IF; END $$; COMMENT ON COLUMN train_student_checkin.student_id IS '学员ID (冗余自 train_enrollment.student_id,随考勤行落库)'; -- 步骤 2: 以参训档案为准回填历史数据 UPDATE train_student_checkin a SET student_id = e.student_id FROM train_enrollment e WHERE e.enrollment_id = a.enrollment_id AND (a.student_id IS NULL OR a.student_id <> e.student_id); -- 步骤 3: 按学员维度检索的索引 CREATE INDEX IF NOT EXISTS idx_checkin_student ON train_student_checkin (student_id); -- 步骤 4: 回填结果校验 (存在无参训档案的脏数据时仅告警,不中断发布) DO $$ DECLARE v_null_cnt INT; BEGIN SELECT count(*) INTO v_null_cnt FROM train_student_checkin WHERE student_id IS NULL; IF v_null_cnt > 0 THEN RAISE NOTICE '>>> [CheckinStudentId-WARN] 仍有 % 行 student_id 为空,请核对 enrollment_id 是否有效', v_null_cnt; ELSE RAISE NOTICE '>>> [CheckinStudentId-PASS] train_student_checkin.student_id 已全量回填'; END IF; END $$; COMMIT;