migrate_scene_module.sql 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. -- ============================================================
  2. -- 场景模块数据库迁移脚本
  3. -- 用途:对齐 Go 版本的场景模块功能
  4. -- 创建时间:2026-04-02
  5. -- ============================================================
  6. -- 1. 创建场景模板表
  7. -- ============================================================
  8. CREATE TABLE IF NOT EXISTS `scene_template` (
  9. `id` bigint NOT NULL AUTO_INCREMENT,
  10. `scene_name` varchar(255) NOT NULL COMMENT '场景名称',
  11. `scene_type` varchar(100) NOT NULL COMMENT '场景类型(如 bridge, tunnel)',
  12. `scene_desc` text COMMENT '场景描述',
  13. `model_name` varchar(255) NOT NULL COMMENT 'YOLO 模型名称',
  14. `created_at` bigint DEFAULT NULL COMMENT '创建时间(Unix 时间戳)',
  15. `updated_at` bigint DEFAULT NULL COMMENT '更新时间(Unix 时间戳)',
  16. `deleted_at` bigint DEFAULT NULL COMMENT '删除时间(Unix 时间戳)',
  17. `is_deleted` bigint DEFAULT '0' COMMENT '是否删除 0:否 1:是',
  18. PRIMARY KEY (`id`),
  19. KEY `idx_scene_type` (`scene_type`),
  20. KEY `idx_is_deleted` (`is_deleted`)
  21. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='场景模板表';
  22. -- 2. 检查并添加 recognition_record 表缺失字段
  23. -- ============================================================
  24. -- 2.1 添加 scene_type 字段(如果不存在)
  25. SET @column_exists = (
  26. SELECT COUNT(*)
  27. FROM INFORMATION_SCHEMA.COLUMNS
  28. WHERE TABLE_SCHEMA = DATABASE()
  29. AND TABLE_NAME = 'recognition_record'
  30. AND COLUMN_NAME = 'scene_type'
  31. );
  32. SET @sql = IF(@column_exists = 0,
  33. 'ALTER TABLE `recognition_record` ADD COLUMN `scene_type` varchar(100) DEFAULT '''' COMMENT ''场景类型'' AFTER `user_id`',
  34. 'SELECT ''scene_type 字段已存在'' AS message'
  35. );
  36. PREPARE stmt FROM @sql;
  37. EXECUTE stmt;
  38. DEALLOCATE PREPARE stmt;
  39. -- 2.2 添加 hazard_count 字段(如果不存在)
  40. SET @column_exists = (
  41. SELECT COUNT(*)
  42. FROM INFORMATION_SCHEMA.COLUMNS
  43. WHERE TABLE_SCHEMA = DATABASE()
  44. AND TABLE_NAME = 'recognition_record'
  45. AND COLUMN_NAME = 'hazard_count'
  46. );
  47. SET @sql = IF(@column_exists = 0,
  48. 'ALTER TABLE `recognition_record` ADD COLUMN `hazard_count` int DEFAULT 0 COMMENT ''隐患数量'' AFTER `recognition_image_url`',
  49. 'SELECT ''hazard_count 字段已存在'' AS message'
  50. );
  51. PREPARE stmt FROM @sql;
  52. EXECUTE stmt;
  53. DEALLOCATE PREPARE stmt;
  54. -- 2.3 添加 current_step 字段(如果不存在)
  55. SET @column_exists = (
  56. SELECT COUNT(*)
  57. FROM INFORMATION_SCHEMA.COLUMNS
  58. WHERE TABLE_SCHEMA = DATABASE()
  59. AND TABLE_NAME = 'recognition_record'
  60. AND COLUMN_NAME = 'current_step'
  61. );
  62. SET @sql = IF(@column_exists = 0,
  63. 'ALTER TABLE `recognition_record` ADD COLUMN `current_step` int DEFAULT 1 COMMENT ''当前步骤(1-3)'' AFTER `hazard_count`',
  64. 'SELECT ''current_step 字段已存在'' AS message'
  65. );
  66. PREPARE stmt FROM @sql;
  67. EXECUTE stmt;
  68. DEALLOCATE PREPARE stmt;
  69. -- 2.4 添加 hazard_details 字段(如果不存在)
  70. SET @column_exists = (
  71. SELECT COUNT(*)
  72. FROM INFORMATION_SCHEMA.COLUMNS
  73. WHERE TABLE_SCHEMA = DATABASE()
  74. AND TABLE_NAME = 'recognition_record'
  75. AND COLUMN_NAME = 'hazard_details'
  76. );
  77. SET @sql = IF(@column_exists = 0,
  78. 'ALTER TABLE `recognition_record` ADD COLUMN `hazard_details` text COMMENT ''隐患详情 JSON'' AFTER `current_step`',
  79. 'SELECT ''hazard_details 字段已存在'' AS message'
  80. );
  81. PREPARE stmt FROM @sql;
  82. EXECUTE stmt;
  83. DEALLOCATE PREPARE stmt;
  84. -- 3. 添加索引(如果不存在)
  85. -- ============================================================
  86. -- 3.1 添加 scene_type 索引
  87. SET @index_exists = (
  88. SELECT COUNT(*)
  89. FROM INFORMATION_SCHEMA.STATISTICS
  90. WHERE TABLE_SCHEMA = DATABASE()
  91. AND TABLE_NAME = 'recognition_record'
  92. AND INDEX_NAME = 'idx_scene_type'
  93. );
  94. SET @sql = IF(@index_exists = 0,
  95. 'ALTER TABLE `recognition_record` ADD INDEX `idx_scene_type` (`scene_type`)',
  96. 'SELECT ''idx_scene_type 索引已存在'' AS message'
  97. );
  98. PREPARE stmt FROM @sql;
  99. EXECUTE stmt;
  100. DEALLOCATE PREPARE stmt;
  101. -- 3.2 添加联合索引(user_id + created_at)
  102. SET @index_exists = (
  103. SELECT COUNT(*)
  104. FROM INFORMATION_SCHEMA.STATISTICS
  105. WHERE TABLE_SCHEMA = DATABASE()
  106. AND TABLE_NAME = 'recognition_record'
  107. AND INDEX_NAME = 'idx_user_created'
  108. );
  109. SET @sql = IF(@index_exists = 0,
  110. 'ALTER TABLE `recognition_record` ADD INDEX `idx_user_created` (`user_id`, `created_at`)',
  111. 'SELECT ''idx_user_created 索引已存在'' AS message'
  112. );
  113. PREPARE stmt FROM @sql;
  114. EXECUTE stmt;
  115. DEALLOCATE PREPARE stmt;
  116. -- 4. 验证迁移结果
  117. -- ============================================================
  118. SELECT '=== 迁移完成,验证表结构 ===' AS message;
  119. -- 验证 scene_template 表
  120. SELECT
  121. TABLE_NAME,
  122. TABLE_COMMENT,
  123. TABLE_ROWS
  124. FROM INFORMATION_SCHEMA.TABLES
  125. WHERE TABLE_SCHEMA = DATABASE()
  126. AND TABLE_NAME = 'scene_template';
  127. -- 验证 recognition_record 表新增字段
  128. SELECT
  129. COLUMN_NAME,
  130. COLUMN_TYPE,
  131. COLUMN_DEFAULT,
  132. COLUMN_COMMENT
  133. FROM INFORMATION_SCHEMA.COLUMNS
  134. WHERE TABLE_SCHEMA = DATABASE()
  135. AND TABLE_NAME = 'recognition_record'
  136. AND COLUMN_NAME IN ('scene_type', 'hazard_count', 'current_step', 'hazard_details')
  137. ORDER BY ORDINAL_POSITION;
  138. -- 验证索引
  139. SELECT
  140. INDEX_NAME,
  141. COLUMN_NAME,
  142. SEQ_IN_INDEX
  143. FROM INFORMATION_SCHEMA.STATISTICS
  144. WHERE TABLE_SCHEMA = DATABASE()
  145. AND TABLE_NAME = 'recognition_record'
  146. AND INDEX_NAME IN ('idx_scene_type', 'idx_user_created')
  147. ORDER BY INDEX_NAME, SEQ_IN_INDEX;
  148. SELECT '=== 迁移脚本执行完成 ===' AS message;