Files
cattleTransportation/tradeCattle/TRIGGER_FIX_GUIDE.md
2025-10-29 17:33:32 +08:00

5.8 KiB
Raw Blame History

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 定义:

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: 测试功能

  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. 清除所有缓存

    Remove-Item -Recurse -Force tradeCattle\target
    Remove-Item -Recurse -Force tradeCattle\.idea
    
  2. 检查是否有其他引用

    -- 检查存储过程
    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
状态: 问题已确认,解决方案已就绪