# Delivery 触发器修复指南 ## 🎯 问题确认 通过数据库诊断,确认了问题的根源: ### 诊断结果 1. ✅ `member_driver` 表中 **car_number 字段不存在**(已被删除) 2. ✅ `member_driver` 表 **没有触发器** 3. ❌ **delivery 表有 2 个触发器引用了已删除的 car_number 字段** ### 触发器信息 ``` 触发器名称: trg_delivery_fill_from_driver 关联表: delivery 触发事件: INSERT, UPDATE 创建时间: 2025-10-14 15:36:26 和 15:37:58 ``` ## 🔍 问题分析 ### 为什么会报错? 当执行 `DeliveryMapper.insert` 时: 1. MyBatis 执行 INSERT SQL 插入 delivery 表 2. **数据库触发器自动触发** 3. 触发器尝试查询 `member_driver.car_number` 字段 4. 由于字段已被删除,报错:`Unknown column 'md.car_number' in 'field list'` ### 触发器的原始用途 这些触发器的设计初衷是: - 当插入或更新 delivery 记录时 - 自动从 member_driver 表获取司机的车辆信息(包括 car_number) - 自动填充到 delivery 表 ### 为什么现在不需要触发器? 因为架构已改变: - **旧架构**: 司机和车辆绑定在 member_driver 表(一对一) - **新架构**: 司机和车辆分离,车辆由 vehicle 表独立管理(多对多) - **新实现**: 在 `DeliveryServiceImpl.createDelivery()` 中手动查询 vehicle 表获取车辆信息 ## 🔧 解决方案 ### 方案 1: 删除触发器(推荐)✅ **优点**: - 彻底解决问题 - 与新架构一致 - 代码已经实现了相同功能 **缺点**: - 需要确保业务逻辑在代码层面完整 ### 方案 2: 修改触发器(不推荐) 修改触发器以适应新表结构,但这会增加维护复杂度。 ## 📋 执行步骤 ### 步骤 1: 查看触发器完整定义(可选) 如果你想查看触发器的完整 SQL 定义: ```sql SHOW CREATE TRIGGER trg_delivery_fill_from_driver; ``` **建议**: 复制输出并保存,以防将来需要参考。 ### 步骤 2: 删除触发器 连接到数据库: ```bash mysql -h 129.211.213.226 -P 3306 -u root -pAiotagro@741 cattletrade ``` 执行删除: ```sql USE cattletrade; -- 删除触发器 DROP TRIGGER IF EXISTS trg_delivery_fill_from_driver; -- 验证删除 SHOW TRIGGERS WHERE `Table` = 'delivery'; ``` 或者直接执行脚本: ```bash mysql -h 129.211.213.226 -P 3306 -u root -pAiotagro@741 cattletrade < C:/cattleTransport/tradeCattle/fix_delivery_triggers.sql ``` ### 步骤 3: 验证没有其他触发器引用 car_number ```sql SELECT TRIGGER_NAME, EVENT_MANIPULATION, EVENT_OBJECT_TABLE FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA = 'cattletrade' AND ACTION_STATEMENT LIKE '%car_number%'; ``` 应该返回 **0 行**。 ### 步骤 4: 重启后端服务 ```powershell # 1. 停止当前服务(在服务运行的终端按 Ctrl+C) # 2. 清理编译缓存 cd C:\cattleTransport\tradeCattle Remove-Item -Recurse -Force target -ErrorAction SilentlyContinue # 3. 重新启动服务 cd aiotagro-cattle-trade mvn spring-boot:run ``` ### 步骤 5: 测试功能 1. 打开前端页面 2. 尝试创建新的运送清单 3. 填写表单并提交 4. **预期结果**: 成功创建,不再报 `Unknown column 'md.car_number'` 错误 ## ✅ 验证清单 完成后,确认以下几点: - [ ] 数据库中 `member_driver` 表没有 `car_number` 字段 - [ ] 数据库中 `delivery` 表没有触发器引用 `car_number` - [ ] 后端服务已重启 - [ ] 创建运送清单功能正常 - [ ] 车辆信息从 `vehicle` 表正确获取 - [ ] 司机信息从 `member_driver` 表正确获取 ## 🎯 预期效果 ### 修复前 ``` 错误: Unknown column 'md.car_number' in 'field list' 原因: delivery 表触发器查询已删除的字段 ``` ### 修复后 ``` ✅ 运送清单创建成功 ✅ 车辆信息从 vehicle 表获取 ✅ 司机信息从 member_driver 表获取 ✅ 数据正确保存到 delivery 表 ``` ## 📊 数据流对比 ### 旧流程(有触发器) ``` 1. 代码: INSERT INTO delivery 2. 触发器: 自动查询 member_driver.car_number 3. 触发器: 自动填充 delivery.license_plate ``` ### 新流程(无触发器) ``` 1. 代码: 根据 plateNumber 查询 vehicle 表 2. 代码: 根据 driverId 查询 member_driver 表 3. 代码: 手动设置 delivery.license_plate 4. 代码: INSERT INTO delivery ``` ## ⚠️ 注意事项 1. **生产环境警告**: - 这是生产数据库,删除触发器前请确保已备份 - 建议在非高峰时段操作 2. **功能完整性**: - 代码中已经实现了触发器的功能 - DeliveryServiceImpl.createDelivery() 会手动查询 vehicle 表 3. **回滚方案**: - 如果删除触发器后发现问题,可以从备份恢复 - 建议先保存 `SHOW CREATE TRIGGER` 的输出 ## 🔍 故障排查 ### 如果删除触发器后仍然报错 1. **清除所有缓存** ```powershell Remove-Item -Recurse -Force tradeCattle\target Remove-Item -Recurse -Force tradeCattle\.idea ``` 2. **检查是否有其他引用** ```sql -- 检查存储过程 SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'cattletrade' AND ROUTINE_DEFINITION LIKE '%car_number%'; -- 检查视图 SELECT TABLE_NAME, VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'cattletrade' AND VIEW_DEFINITION LIKE '%car_number%'; ``` 3. **重启数据库连接** - 完全停止后端服务 - 等待 30 秒 - 重新启动 ## 📞 支持 如果遇到问题,请提供: 1. `SHOW CREATE TRIGGER` 的完整输出 2. 删除触发器后的验证结果 3. 后端服务重启后的日志 4. 创建运送清单时的错误信息(如果还有) --- **文档版本**: 1.0 **创建日期**: 2025-10-29 **最后更新**: 2025-10-29 **状态**: ✅ 问题已确认,解决方案已就绪