54 lines
2.2 KiB
PL/PgSQL
54 lines
2.2 KiB
PL/PgSQL
-- ==============================================================================
|
|
-- 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;
|