-- ============================================================================== -- RailwaySystem V2 -> MySQL 5.7 结构对账脚本 (reconcile_mysql_5_7.sql) -- 适用数据库: MySQL 5.7 (线上部署库) -- 目标: 将线上 MySQL 表结构对齐 V2 基线,消除两类反复出现的错误: -- 1) Field 'create_time' doesn't have a default value -- 2) Unknown column 'xxx' in 'field list' (缺失列) -- 说明: -- * 本脚本只"设置默认值 / 按需补列",**不改列类型**,对已有默认值的列为幂等操作。 -- * 使用 information_schema 守卫,列已存在/已有默认也不会报错,可重复执行。 -- * train_class_report 的 alloc_* 列: 应用当前 mapper 仍在 SELECT,故补回; -- 若后续按最终 V2 设计改为依赖 train_dorm_auth,应同步清理应用侧(见文件末尾说明)。 -- 执行: mysql -u -p railwaysystem < reconcile_mysql_5_7.sql -- ============================================================================== DELIMITER $$ -- 仅当列存在时设置默认值(列名/表名已存在即可,重复设置同值幂等) DROP PROCEDURE IF EXISTS set_default_if_missing $$ CREATE PROCEDURE set_default_if_missing( IN p_tbl VARCHAR(64), IN p_col VARCHAR(64), IN p_def VARCHAR(255) ) BEGIN IF EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = p_tbl AND column_name = p_col ) THEN SET @stmt = CONCAT('ALTER TABLE `', p_tbl, '` ALTER COLUMN `', p_col, '` SET DEFAULT ', p_def); PREPARE s FROM @stmt; EXECUTE s; DEALLOCATE PREPARE s; END IF; END $$ -- 仅当列不存在时新增列 DROP PROCEDURE IF EXISTS add_col_if_missing $$ CREATE PROCEDURE add_col_if_missing( IN p_tbl VARCHAR(64), IN p_col VARCHAR(64), IN p_spec VARCHAR(255) ) BEGIN IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = p_tbl AND column_name = p_col ) THEN SET @stmt = CONCAT('ALTER TABLE `', p_tbl, '` ADD COLUMN `', p_col, '` ', p_spec); PREPARE s FROM @stmt; EXECUTE s; DEALLOCATE PREPARE s; END IF; END $$ DELIMITER ; -- ------------------------------------------------------------------------------ -- 1) train_class_report: 补齐应用 mapper 仍在 SELECT 的 alloc_* 列 (若已加则跳过) -- ------------------------------------------------------------------------------ CALL add_col_if_missing('train_class_report', 'alloc_dorm_id', 'VARCHAR(32) NULL'); CALL add_col_if_missing('train_class_report', 'alloc_classroom_id', 'VARCHAR(32) NULL'); CALL add_col_if_missing('train_class_report', 'alloc_site_id', 'VARCHAR(32) NULL'); -- ------------------------------------------------------------------------------ -- 2) 为所有 V2 业务表的 create_time 补默认值 (核心: 消除当前 'doesn''t have a default value') -- V2 基线均为 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,线上 5.7 翻译时丢失。 -- ------------------------------------------------------------------------------ CALL set_default_if_missing('train_resource', 'create_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_course_resource', 'create_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_plan_course', 'create_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_enrollment', 'create_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_lesson', 'create_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_accommodation', 'create_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_score_item', 'create_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_student_score', 'create_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_class_report', 'create_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_dorm_auth', 'create_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_student_checkin', 'create_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_study_duration', 'create_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_student_portrait', 'create_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_electronic_board', 'create_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_classroom_info', 'create_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_training_site', 'create_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_dormitory_info', 'create_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_class_plan', 'create_time', 'CURRENT_TIMESTAMP'); -- ------------------------------------------------------------------------------ -- 3) 其它 V2 中 NOT NULL 且带默认值、但线上可能丢失的列 -- ------------------------------------------------------------------------------ CALL set_default_if_missing('train_resource', 'status', '1'); CALL set_default_if_missing('train_resource', 'del_flag', '''0'''); CALL set_default_if_missing('train_enrollment', 'enrollment_status', '0'); CALL set_default_if_missing('train_accommodation', 'assigned_time', 'CURRENT_TIMESTAMP'); CALL set_default_if_missing('train_accommodation', 'accommodation_status', '0'); CALL set_default_if_missing('train_score_item', 'item_type', '1'); CALL set_default_if_missing('train_score_item', 'weight', '0.00'); CALL set_default_if_missing('train_score_item', 'full_score', '100.00'); CALL set_default_if_missing('train_student_score', 'import_time', 'CURRENT_TIMESTAMP'); -- ------------------------------------------------------------------------------ -- 清理临时存储过程 -- ------------------------------------------------------------------------------ DROP PROCEDURE IF EXISTS set_default_if_missing; DROP PROCEDURE IF EXISTS add_col_if_missing;