-- ===================================================== -- 车辆异常运行监控告警功能 - 数据库升级脚本 -- 用于更新已存在的表结构 -- ===================================================== -- 检查并修改 tb_vehicle_alert_config 表结构 -- 如果表已存在但字段不正确,需要先删除旧字段,再添加新字段 -- 1. 删除旧的唯一索引 ALTER TABLE `tb_vehicle_alert_config` DROP INDEX IF EXISTS `uk_type_target`; -- 2. 检查是否存在 target_id 字段,如果存在则删除 SET @exist_target_id := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tb_vehicle_alert_config' AND COLUMN_NAME = 'target_id'); SET @sql_drop_target_id = IF(@exist_target_id > 0, 'ALTER TABLE `tb_vehicle_alert_config` DROP COLUMN `target_id`', 'SELECT ''target_id column does not exist'''); PREPARE stmt FROM @sql_drop_target_id; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 3. 添加 dept_id 字段(如果不存在) SET @exist_dept_id := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tb_vehicle_alert_config' AND COLUMN_NAME = 'dept_id'); SET @sql_add_dept_id = IF(@exist_dept_id = 0, 'ALTER TABLE `tb_vehicle_alert_config` ADD COLUMN `dept_id` bigint(20) DEFAULT NULL COMMENT ''部门ID(部门配置时使用)'' AFTER `config_type`', 'SELECT ''dept_id column already exists'''); PREPARE stmt FROM @sql_add_dept_id; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 4. 添加 vehicle_id 字段(如果不存在) SET @exist_vehicle_id := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tb_vehicle_alert_config' AND COLUMN_NAME = 'vehicle_id'); SET @sql_add_vehicle_id = IF(@exist_vehicle_id = 0, 'ALTER TABLE `tb_vehicle_alert_config` ADD COLUMN `vehicle_id` bigint(20) DEFAULT NULL COMMENT ''车辆ID(车辆配置时使用)'' AFTER `dept_id`', 'SELECT ''vehicle_id column already exists'''); PREPARE stmt FROM @sql_add_vehicle_id; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 5. 检查是否存在 notify_roles 字段,如果存在则删除 SET @exist_notify_roles := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tb_vehicle_alert_config' AND COLUMN_NAME = 'notify_roles'); SET @sql_drop_notify_roles = IF(@exist_notify_roles > 0, 'ALTER TABLE `tb_vehicle_alert_config` DROP COLUMN `notify_roles`', 'SELECT ''notify_roles column does not exist'''); PREPARE stmt FROM @sql_drop_notify_roles; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 6. 修改 enabled 字段为 status(如果存在 enabled) SET @exist_enabled := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tb_vehicle_alert_config' AND COLUMN_NAME = 'enabled'); SET @sql_change_enabled = IF(@exist_enabled > 0, 'ALTER TABLE `tb_vehicle_alert_config` CHANGE COLUMN `enabled` `status` char(1) DEFAULT ''0'' COMMENT ''状态(0-启用 1-停用)''', 'SELECT ''enabled column does not exist, may already be status'''); PREPARE stmt FROM @sql_change_enabled; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 7. 删除旧索引 ALTER TABLE `tb_vehicle_alert_config` DROP INDEX IF EXISTS `idx_target_id`; ALTER TABLE `tb_vehicle_alert_config` DROP INDEX IF EXISTS `idx_enabled`; -- 8. 创建新的唯一索引 -- 先检查索引是否存在 SET @exist_uk_vehicle := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tb_vehicle_alert_config' AND INDEX_NAME = 'uk_vehicle_config'); SET @sql_add_uk_vehicle = IF(@exist_uk_vehicle = 0, 'ALTER TABLE `tb_vehicle_alert_config` ADD UNIQUE KEY `uk_vehicle_config` (`config_type`, `vehicle_id`)', 'SELECT ''uk_vehicle_config index already exists'''); PREPARE stmt FROM @sql_add_uk_vehicle; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @exist_uk_dept := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tb_vehicle_alert_config' AND INDEX_NAME = 'uk_dept_config'); SET @sql_add_uk_dept = IF(@exist_uk_dept = 0, 'ALTER TABLE `tb_vehicle_alert_config` ADD UNIQUE KEY `uk_dept_config` (`config_type`, `dept_id`)', 'SELECT ''uk_dept_config index already exists'''); PREPARE stmt FROM @sql_add_uk_dept; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 9. 创建新的普通索引 SET @exist_idx_dept := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tb_vehicle_alert_config' AND INDEX_NAME = 'idx_dept_id'); SET @sql_add_idx_dept = IF(@exist_idx_dept = 0, 'ALTER TABLE `tb_vehicle_alert_config` ADD KEY `idx_dept_id` (`dept_id`)', 'SELECT ''idx_dept_id index already exists'''); PREPARE stmt FROM @sql_add_idx_dept; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @exist_idx_vehicle := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tb_vehicle_alert_config' AND INDEX_NAME = 'idx_vehicle_id'); SET @sql_add_idx_vehicle = IF(@exist_idx_vehicle = 0, 'ALTER TABLE `tb_vehicle_alert_config` ADD KEY `idx_vehicle_id` (`vehicle_id`)', 'SELECT ''idx_vehicle_id index already exists'''); PREPARE stmt FROM @sql_add_idx_vehicle; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @exist_idx_status := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tb_vehicle_alert_config' AND INDEX_NAME = 'idx_status'); SET @sql_add_idx_status = IF(@exist_idx_status = 0, 'ALTER TABLE `tb_vehicle_alert_config` ADD KEY `idx_status` (`status`)', 'SELECT ''idx_status index already exists'''); PREPARE stmt FROM @sql_add_idx_status; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 10. 更新已有的全局配置记录 UPDATE `tb_vehicle_alert_config` SET `dept_id` = NULL, `vehicle_id` = NULL WHERE `config_type` = 'GLOBAL'; -- 升级完成提示 SELECT '数据库升级完成!tb_vehicle_alert_config 表结构已更新' AS 'Status';