-- ============================================================================ -- 生产环境表结构补丁:对齐开发环境 -- -- 基准对比: -- 生产环境 tuanwei_20260921152032l8u4e.sql(MariaDB 10.6.26,54 张表) -- 开发环境 132.232.214.96:13306/tuanwei(MySQL 8.0.44,57 张表,实时读取) -- -- 差异汇总(已逐表逐列逐索引比对,过滤导出格式差异后): -- 1. 缺失 3 张表 gxmu_student / gxmu_teacher / gxmu_sync_record -- 2. 缺失 2 个唯一键 gxmu_class.uk_gxmu_class_code -- sys_organization.uk_sys_organization_code -- 3. 列差异 0 处 54 张共有表的 965 个列,类型/可空/默认值/注释全部一致 -- -- 说明:生产库是 MariaDB 10.6,开发库是 MySQL 8.0,两者 DDL 语法在本补丁 -- 涉及范围内完全兼容。 -- 可重复执行:建表用 IF NOT EXISTS,加索引前先查 information_schema。 -- ============================================================================ -- --------------------------------------------------------------------------- -- 1. 学生名册(与 sys_user 账号分离,见 ADR-0001) -- --------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `gxmu_student` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', `xh` varchar(32) NOT NULL COMMENT '学号(开放平台外部键)', `xm` varchar(64) DEFAULT NULL COMMENT '姓名', `xbm` varchar(8) DEFAULT NULL COMMENT '性别码(平台原始)', `sex` varchar(16) DEFAULT NULL COMMENT '性别名称', `mzm` varchar(8) DEFAULT NULL COMMENT '民族码(平台原始)', `nation` varchar(32) DEFAULT NULL COMMENT '民族名称', `zzmmm` varchar(8) DEFAULT NULL COMMENT '政治面貌码(平台原始)', `politics` varchar(64) DEFAULT NULL COMMENT '政治面貌名称', `sfzjh` varchar(32) DEFAULT NULL COMMENT '身份证件号', `sjh` varchar(32) DEFAULT NULL COMMENT '手机号(认领键)', `bjm` varchar(64) DEFAULT NULL COMMENT '平台班级码(原始)', `bh` varchar(64) DEFAULT NULL COMMENT '平台班号(学籍库原始)', `class_id` int DEFAULT NULL COMMENT '解析出的班级ID', `college_id` int DEFAULT NULL COMMENT '解析出的学院ID', `dwh` varchar(64) DEFAULT NULL COMMENT '单位号(平台原始)', `zyh` varchar(32) DEFAULT NULL COMMENT '专业号', `zymc` varchar(128) DEFAULT NULL COMMENT '专业名称', `pyccmc` varchar(32) DEFAULT NULL COMMENT '培养层次', `sfzx` varchar(8) DEFAULT NULL COMMENT '是否在校', `xjzt` varchar(32) DEFAULT NULL COMMENT '学籍状态', `xsdqzt` varchar(32) DEFAULT NULL COMMENT '学生当前状态', `csrq` varchar(20) DEFAULT NULL COMMENT '出生日期', `user_id` int DEFAULT NULL COMMENT '认领后的 sys_user.user_id', `claim_time` datetime DEFAULT NULL COMMENT '认领时间', `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态:1在校 0毕业/结业/休学', `sync_time` datetime DEFAULT NULL COMMENT '最近同步时间', `tenant_id` int DEFAULT NULL COMMENT '租户ID', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记:0未删 1已删', `row_hash` varchar(32) DEFAULT NULL COMMENT '平台权威字段指纹,用于跳过未变更行', PRIMARY KEY (`id`), UNIQUE KEY `uk_gxmu_student_xh` (`tenant_id`,`xh`), KEY `idx_gxmu_student_xh` (`xh`), KEY `idx_gxmu_student_sjh` (`sjh`), KEY `idx_gxmu_student_class` (`class_id`), KEY `idx_gxmu_student_college` (`college_id`), KEY `idx_gxmu_student_uid` (`user_id`), KEY `idx_gxmu_student_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生名册(开放平台同步)'; -- --------------------------------------------------------------------------- -- 2. 教师名册 -- --------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `gxmu_teacher` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', `jgh` varchar(32) NOT NULL COMMENT '教工号(开放平台外部键)', `xm` varchar(64) DEFAULT NULL COMMENT '姓名', `xbm` varchar(8) DEFAULT NULL COMMENT '性别码(平台原始)', `sex` varchar(16) DEFAULT NULL COMMENT '性别名称', `dwh` varchar(64) DEFAULT NULL COMMENT '单位号(平台原始)', `college_id` int DEFAULT NULL COMMENT '解析出的学院ID', `ksjybh` varchar(64) DEFAULT NULL COMMENT '科室教研室编号', `sjh` varchar(32) DEFAULT NULL COMMENT '手机号(敏感字段, 不对外输出)', `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态:1启用 0停用', `sync_time` datetime DEFAULT NULL COMMENT '最近同步时间', `tenant_id` int DEFAULT NULL COMMENT '租户ID', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记:0未删 1已删', PRIMARY KEY (`id`), UNIQUE KEY `uk_gxmu_teacher_jgh` (`tenant_id`,`jgh`), KEY `idx_gxmu_teacher_jgh` (`jgh`), KEY `idx_gxmu_teacher_college` (`college_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='教师名册(开放平台同步)'; -- --------------------------------------------------------------------------- -- 3. 开放平台同步记录 -- --------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `gxmu_sync_record` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `batch_id` varchar(64) DEFAULT NULL COMMENT '批次号(同一次触发的各段共享)', `sync_type` varchar(32) NOT NULL COMMENT '同步类型:dept/teacher/class/student', `trigger_type` varchar(16) NOT NULL COMMENT '触发方式:schedule/manual', `trigger_user` varchar(100) DEFAULT NULL COMMENT '触发人(手动触发时)', `start_time` datetime DEFAULT NULL COMMENT '开始时间', `end_time` datetime DEFAULT NULL COMMENT '结束时间', `success_count` int NOT NULL DEFAULT '0' COMMENT '成功条数', `fail_count` int NOT NULL DEFAULT '0' COMMENT '失败条数', `skip_count` int NOT NULL DEFAULT '0' COMMENT '跳过条数', `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态:0成功 1失败', `error_msg` varchar(1000) DEFAULT NULL COMMENT '错误摘要(不含手机号/身份证)', `tenant_id` int DEFAULT NULL COMMENT '租户ID', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_gxmu_sync_record_batch` (`batch_id`), KEY `idx_gxmu_sync_record_start` (`start_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='开放平台同步记录'; -- --------------------------------------------------------------------------- -- 4. 唯一键(幂等 upsert 的前提) -- 先把手写的空串规范成 NULL,否则唯一键会被一堆 '' 互撞。 -- 生产库现有数据若存在 (tenant_id, class_code) 或 (tenant_id, organization_code) -- 重复,加唯一键会失败——见文件末尾的预检查语句。 -- --------------------------------------------------------------------------- UPDATE `gxmu_class` SET `class_code` = NULL WHERE `class_code` = ''; UPDATE `sys_organization` SET `organization_code` = NULL WHERE `organization_code` = ''; SET @exist := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gxmu_class' AND INDEX_NAME = 'uk_gxmu_class_code'); SET @stmt := IF(@exist = 0, 'ALTER TABLE `gxmu_class` ADD UNIQUE KEY `uk_gxmu_class_code` (`tenant_id`, `class_code`)', 'SELECT 1'); PREPARE s FROM @stmt; EXECUTE s; DEALLOCATE PREPARE s; SET @exist := (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'sys_organization' AND INDEX_NAME = 'uk_sys_organization_code'); SET @stmt := IF(@exist = 0, 'ALTER TABLE `sys_organization` ADD UNIQUE KEY `uk_sys_organization_code` (`tenant_id`, `organization_code`)', 'SELECT 1'); PREPARE s FROM @stmt; EXECUTE s; DEALLOCATE PREPARE s; -- ============================================================================ -- 附:执行前建议先跑这两条预检查,确认无重复值再加唯一键 -- ============================================================================ -- SELECT tenant_id, class_code, COUNT(*) c FROM gxmu_class -- WHERE class_code IS NOT NULL AND class_code <> '' -- GROUP BY tenant_id, class_code HAVING c > 1; -- -- SELECT tenant_id, organization_code, COUNT(*) c FROM sys_organization -- WHERE organization_code IS NOT NULL AND organization_code <> '' -- GROUP BY tenant_id, organization_code HAVING c > 1;