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