Files
hzdyjs/docs/设计文档/database/学工管理-学生信息管理/19-fix-missing-columns-compatible.sql
T
2025-07-19 10:18:27 +08:00

186 lines
13 KiB
SQL

-- ==============================
-- 修复 xg_student_info 表缺失字段 (MySQL 5.7兼容版本)
-- 创建时间: 2025-01-15
-- 说明: 使用存储过程检查字段是否存在,避免重复添加
-- ==============================
USE `hzdyjs_xg`;
-- 创建添加字段的存储过程
DELIMITER $$
DROP PROCEDURE IF EXISTS AddColumnIfNotExists$$
CREATE PROCEDURE AddColumnIfNotExists(
IN table_name VARCHAR(128),
IN column_name VARCHAR(128),
IN column_definition TEXT
)
BEGIN
DECLARE column_exists INT DEFAULT 0;
-- 检查字段是否存在
SELECT COUNT(*) INTO column_exists
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = table_name
AND COLUMN_NAME = column_name;
-- 如果字段不存在,则添加
IF column_exists = 0 THEN
SET @sql = CONCAT('ALTER TABLE `', table_name, '` ADD COLUMN `', column_name, '` ', column_definition);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT CONCAT('Added column: ', column_name) as message;
ELSE
SELECT CONCAT('Column already exists: ', column_name) as message;
END IF;
END$$
DELIMITER ;
-- 开始添加字段
SELECT 'Starting to add missing columns to xg_student_info table...' as message;
-- 1. 添加基本信息字段
CALL AddColumnIfNotExists('xg_student_info', 'nation', 'varchar(20) DEFAULT NULL COMMENT \'民族\' AFTER `birth_date`');
CALL AddColumnIfNotExists('xg_student_info', 'name_english', 'varchar(100) DEFAULT NULL COMMENT \'英文姓名\' AFTER `name`');
CALL AddColumnIfNotExists('xg_student_info', 'former_name', 'varchar(50) DEFAULT NULL COMMENT \'曾用名\' AFTER `name_english`');
CALL AddColumnIfNotExists('xg_student_info', 'name_pinyin', 'varchar(200) DEFAULT NULL COMMENT \'姓名拼音\' AFTER `former_name`');
CALL AddColumnIfNotExists('xg_student_info', 'marital_status', 'varchar(10) DEFAULT NULL COMMENT \'婚姻状况:未婚、已婚、离异、丧偶\' AFTER `political_status`');
CALL AddColumnIfNotExists('xg_student_info', 'religion', 'varchar(20) DEFAULT NULL COMMENT \'宗教信仰\' AFTER `marital_status`');
CALL AddColumnIfNotExists('xg_student_info', 'photo_path', 'varchar(500) DEFAULT NULL COMMENT \'学生照片存储路径\' AFTER `photo_url`');
-- 2. 添加学籍信息字段
CALL AddColumnIfNotExists('xg_student_info', 'school_system', 'varchar(10) DEFAULT NULL COMMENT \'学制:3年制、4年制、5年制等\' AFTER `enrollment_year`');
CALL AddColumnIfNotExists('xg_student_info', 'education_level', 'varchar(20) DEFAULT NULL COMMENT \'培养层次:专科、本科、硕士、博士\' AFTER `school_system`');
CALL AddColumnIfNotExists('xg_student_info', 'training_type', 'varchar(20) DEFAULT NULL COMMENT \'培养方式:全日制、非全日制\' AFTER `education_level`');
CALL AddColumnIfNotExists('xg_student_info', 'admission_category', 'varchar(20) DEFAULT NULL COMMENT \'录取类别:统招、自主招生、推荐免试等\' AFTER `training_type`');
CALL AddColumnIfNotExists('xg_student_info', 'source_region', 'varchar(50) DEFAULT NULL COMMENT \'生源地区\' AFTER `admission_category`');
CALL AddColumnIfNotExists('xg_student_info', 'middle_school', 'varchar(100) DEFAULT NULL COMMENT \'毕业中学\' AFTER `source_region`');
-- 3. 添加联系信息字段
CALL AddColumnIfNotExists('xg_student_info', 'qq', 'varchar(20) DEFAULT NULL COMMENT \'QQ号码\' AFTER `email`');
CALL AddColumnIfNotExists('xg_student_info', 'wechat', 'varchar(50) DEFAULT NULL COMMENT \'微信号\' AFTER `qq`');
CALL AddColumnIfNotExists('xg_student_info', 'current_address', 'varchar(200) DEFAULT NULL COMMENT \'现住址\' AFTER `home_address`');
CALL AddColumnIfNotExists('xg_student_info', 'postal_code', 'varchar(10) DEFAULT NULL COMMENT \'邮政编码\' AFTER `current_address`');
CALL AddColumnIfNotExists('xg_student_info', 'domicile_place', 'varchar(100) DEFAULT NULL COMMENT \'户籍所在地\' AFTER `postal_code`');
-- 4. 添加宿舍信息字段
CALL AddColumnIfNotExists('xg_student_info', 'dormitory_building', 'varchar(20) DEFAULT NULL COMMENT \'宿舍楼栋\' AFTER `domicile_place`');
CALL AddColumnIfNotExists('xg_student_info', 'dormitory_room', 'varchar(20) DEFAULT NULL COMMENT \'宿舍房间号\' AFTER `dormitory_building`');
-- 5. 添加紧急联系人字段
CALL AddColumnIfNotExists('xg_student_info', 'emergency_contact_name', 'varchar(50) DEFAULT NULL COMMENT \'紧急联系人姓名\' AFTER `dormitory_room`');
CALL AddColumnIfNotExists('xg_student_info', 'emergency_contact_phone', 'varchar(20) DEFAULT NULL COMMENT \'紧急联系人电话\' AFTER `emergency_contact_name`');
CALL AddColumnIfNotExists('xg_student_info', 'emergency_contact_relation', 'varchar(20) DEFAULT NULL COMMENT \'紧急联系人关系\' AFTER `emergency_contact_phone`');
-- 6. 添加家庭信息字段
CALL AddColumnIfNotExists('xg_student_info', 'father_name', 'varchar(50) DEFAULT NULL COMMENT \'父亲姓名\' AFTER `emergency_contact_relation`');
CALL AddColumnIfNotExists('xg_student_info', 'father_phone', 'varchar(20) DEFAULT NULL COMMENT \'父亲电话\' AFTER `father_name`');
CALL AddColumnIfNotExists('xg_student_info', 'father_work_unit', 'varchar(100) DEFAULT NULL COMMENT \'父亲工作单位\' AFTER `father_phone`');
CALL AddColumnIfNotExists('xg_student_info', 'father_position', 'varchar(50) DEFAULT NULL COMMENT \'父亲职务\' AFTER `father_work_unit`');
CALL AddColumnIfNotExists('xg_student_info', 'mother_name', 'varchar(50) DEFAULT NULL COMMENT \'母亲姓名\' AFTER `father_position`');
CALL AddColumnIfNotExists('xg_student_info', 'mother_phone', 'varchar(20) DEFAULT NULL COMMENT \'母亲电话\' AFTER `mother_name`');
CALL AddColumnIfNotExists('xg_student_info', 'mother_work_unit', 'varchar(100) DEFAULT NULL COMMENT \'母亲工作单位\' AFTER `mother_phone`');
CALL AddColumnIfNotExists('xg_student_info', 'mother_position', 'varchar(50) DEFAULT NULL COMMENT \'母亲职务\' AFTER `mother_work_unit`');
CALL AddColumnIfNotExists('xg_student_info', 'family_income', 'decimal(10,2) DEFAULT NULL COMMENT \'家庭年收入\' AFTER `mother_position`');
CALL AddColumnIfNotExists('xg_student_info', 'family_members', 'int DEFAULT NULL COMMENT \'家庭成员数量\' AFTER `family_income`');
-- 7. 添加体征信息字段
CALL AddColumnIfNotExists('xg_student_info', 'height', 'decimal(5,2) DEFAULT NULL COMMENT \'身高(cm)\' AFTER `blood_type`');
CALL AddColumnIfNotExists('xg_student_info', 'weight', 'decimal(5,2) DEFAULT NULL COMMENT \'体重(kg)\' AFTER `height`');
CALL AddColumnIfNotExists('xg_student_info', 'health_status', 'varchar(20) DEFAULT NULL COMMENT \'健康状况:健康、一般、较差\' AFTER `weight`');
CALL AddColumnIfNotExists('xg_student_info', 'special_condition', 'varchar(200) DEFAULT NULL COMMENT \'特殊身体状况\' AFTER `health_status`');
CALL AddColumnIfNotExists('xg_student_info', 'medical_history', 'varchar(500) DEFAULT NULL COMMENT \'既往病史\' AFTER `special_condition`');
CALL AddColumnIfNotExists('xg_student_info', 'allergies', 'varchar(200) DEFAULT NULL COMMENT \'过敏史\' AFTER `medical_history`');
-- 8. 添加银行信息字段
CALL AddColumnIfNotExists('xg_student_info', 'bank_card_no', 'varchar(30) DEFAULT NULL COMMENT \'银行卡号\' AFTER `allergies`');
CALL AddColumnIfNotExists('xg_student_info', 'bank_name', 'varchar(50) DEFAULT NULL COMMENT \'开户银行\' AFTER `bank_card_no`');
CALL AddColumnIfNotExists('xg_student_info', 'bank_branch', 'varchar(100) DEFAULT NULL COMMENT \'开户支行\' AFTER `bank_name`');
CALL AddColumnIfNotExists('xg_student_info', 'card_holder_name', 'varchar(50) DEFAULT NULL COMMENT \'持卡人姓名\' AFTER `bank_branch`');
-- 9. 添加特殊标识字段
CALL AddColumnIfNotExists('xg_student_info', 'is_poor_student', 'tinyint(1) DEFAULT 0 COMMENT \'是否贫困生:0-否,1-是\' AFTER `card_holder_name`');
CALL AddColumnIfNotExists('xg_student_info', 'is_minority', 'tinyint(1) DEFAULT 0 COMMENT \'是否少数民族:0-否,1-是\' AFTER `is_poor_student`');
CALL AddColumnIfNotExists('xg_student_info', 'is_disabled', 'tinyint(1) DEFAULT 0 COMMENT \'是否残疾:0-否,1-是\' AFTER `is_minority`');
CALL AddColumnIfNotExists('xg_student_info', 'is_orphan', 'tinyint(1) DEFAULT 0 COMMENT \'是否孤儿:0-否,1-是\' AFTER `is_disabled`');
CALL AddColumnIfNotExists('xg_student_info', 'is_single_parent', 'tinyint(1) DEFAULT 0 COMMENT \'是否单亲家庭:0-否,1-是\' AFTER `is_orphan`');
-- 10. 添加扩展信息字段
CALL AddColumnIfNotExists('xg_student_info', 'specialties', 'varchar(500) DEFAULT NULL COMMENT \'特长爱好\' AFTER `is_single_parent`');
CALL AddColumnIfNotExists('xg_student_info', 'awards', 'text DEFAULT NULL COMMENT \'获奖情况\' AFTER `specialties`');
CALL AddColumnIfNotExists('xg_student_info', 'violations', 'text DEFAULT NULL COMMENT \'违纪记录\' AFTER `awards`');
CALL AddColumnIfNotExists('xg_student_info', 'social_activities', 'text DEFAULT NULL COMMENT \'社会实践活动\' AFTER `violations`');
-- 11. 添加状态管理字段
CALL AddColumnIfNotExists('xg_student_info', 'info_status', 'varchar(10) DEFAULT \'active\' COMMENT \'信息状态:active-正常,inactive-停用,graduated-已毕业\' AFTER `social_activities`');
CALL AddColumnIfNotExists('xg_student_info', 'data_source', 'varchar(20) DEFAULT \'manual\' COMMENT \'数据来源:manual-手动录入,import-批量导入,sync-同步\' AFTER `info_status`');
CALL AddColumnIfNotExists('xg_student_info', 'is_complete', 'tinyint(1) DEFAULT 0 COMMENT \'信息是否完整:0-不完整,1-完整\' AFTER `data_source`');
CALL AddColumnIfNotExists('xg_student_info', 'completion_rate', 'decimal(5,2) DEFAULT 0.00 COMMENT \'信息完整度百分比\' AFTER `is_complete`');
-- 12. 添加扩展字段
CALL AddColumnIfNotExists('xg_student_info', 'ext_field1', 'varchar(200) DEFAULT NULL COMMENT \'扩展字段1\' AFTER `completion_rate`');
CALL AddColumnIfNotExists('xg_student_info', 'ext_field2', 'varchar(200) DEFAULT NULL COMMENT \'扩展字段2\' AFTER `ext_field1`');
CALL AddColumnIfNotExists('xg_student_info', 'ext_field3', 'varchar(200) DEFAULT NULL COMMENT \'扩展字段3\' AFTER `ext_field2`');
CALL AddColumnIfNotExists('xg_student_info', 'ext_field4', 'varchar(200) DEFAULT NULL COMMENT \'扩展字段4\' AFTER `ext_field3`');
CALL AddColumnIfNotExists('xg_student_info', 'ext_field5', 'varchar(200) DEFAULT NULL COMMENT \'扩展字段5\' AFTER `ext_field4`');
-- 13. 添加索引以提高查询性能
SELECT 'Adding indexes for better performance...' as message;
-- 检查索引是否存在的函数
DELIMITER $$
DROP PROCEDURE IF EXISTS AddIndexIfNotExists$$
CREATE PROCEDURE AddIndexIfNotExists(
IN table_name VARCHAR(128),
IN index_name VARCHAR(128),
IN index_definition TEXT
)
BEGIN
DECLARE index_exists INT DEFAULT 0;
-- 检查索引是否存在
SELECT COUNT(*) INTO index_exists
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = table_name
AND INDEX_NAME = index_name;
-- 如果索引不存在,则添加
IF index_exists = 0 THEN
SET @sql = CONCAT('ALTER TABLE `', table_name, '` ADD ', index_definition);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT CONCAT('Added index: ', index_name) as message;
ELSE
SELECT CONCAT('Index already exists: ', index_name) as message;
END IF;
END$$
DELIMITER ;
-- 添加索引
CALL AddIndexIfNotExists('xg_student_info', 'idx_student_no', 'INDEX `idx_student_no` (`student_no`)');
CALL AddIndexIfNotExists('xg_student_info', 'idx_id_card', 'INDEX `idx_id_card` (`id_card`)');
CALL AddIndexIfNotExists('xg_student_info', 'idx_name', 'INDEX `idx_name` (`name`)');
CALL AddIndexIfNotExists('xg_student_info', 'idx_class_code', 'INDEX `idx_class_code` (`class_code`)');
CALL AddIndexIfNotExists('xg_student_info', 'idx_major_code', 'INDEX `idx_major_code` (`major_code`)');
CALL AddIndexIfNotExists('xg_student_info', 'idx_college_code', 'INDEX `idx_college_code` (`college_code`)');
CALL AddIndexIfNotExists('xg_student_info', 'idx_enrollment_year', 'INDEX `idx_enrollment_year` (`enrollment_year`)');
CALL AddIndexIfNotExists('xg_student_info', 'idx_student_status', 'INDEX `idx_student_status` (`student_status`)');
CALL AddIndexIfNotExists('xg_student_info', 'idx_info_status', 'INDEX `idx_info_status` (`info_status`)');
CALL AddIndexIfNotExists('xg_student_info', 'idx_phone', 'INDEX `idx_phone` (`phone`)');
-- 清理存储过程
DROP PROCEDURE IF EXISTS AddColumnIfNotExists;
DROP PROCEDURE IF EXISTS AddIndexIfNotExists;
-- 完成信息
SELECT 'All missing columns have been added successfully!' as message;
SELECT 'Please verify the table structure and test the application.' as message;