wlzboy
2026-03-31 61c4c3f45e4257e2e7662f033e2719e62366c632
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
-- =====================================================
-- 车辆异常运行监控告警功能 - 数据库升级脚本
-- 用于更新已存在的表结构
-- =====================================================
 
-- 检查并修改 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';