Files
tuanwei-java/sql/20260921_prod_patch_align_dev.sql
T
2026-09-22 20:35:21 +08:00

149 lines
8.8 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ============================================================================
-- 生产环境表结构补丁:对齐开发环境
--
-- 基准对比:
-- 生产环境 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;