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

4.3 KiB
Raw Blame History

member_driver 表 car_number 字段删除指南

🔍 问题诊断

错误现象

java.sql.SQLSyntaxErrorException: Unknown column 'md.car_number' in 'field list'

这个错误在执行 DeliveryMapper.insert 时出现,但 INSERT SQL 本身并不包含 md.car_number

可能原因

  1. 数据库触发器 - delivery 表的 INSERT/UPDATE 触发器可能引用了 member_driver.car_number
  2. 数据库视图 - 某个视图可能包含 member_driver.car_number
  3. 字段仍然存在 - member_driver 表中 car_number 字段尚未被删除

📋 解决步骤

步骤 1: 执行诊断脚本

在 MySQL 中执行 remove_car_number_from_member_driver.sql 脚本的诊断部分

# 连接到数据库
mysql -u root -p cattle_trade

# 执行诊断部分(前 46 行)
source C:/cattleTransport/tradeCattle/remove_car_number_from_member_driver.sql

步骤 2: 分析诊断结果

2.1 检查字段是否存在

如果看到 car_number字段存在数量 = 1,说明字段还在数据库中。

2.2 检查触发器

重点关注:

  • delivery 表的触发器 - 可能在 INSERT 时查询 member_driver.car_number
  • member_driver 表的触发器 - 可能在更新时引用 car_number

2.3 检查视图

如果有视图包含 md.car_number,需要先删除或修改视图。

步骤 3: 删除触发器(如果存在)

如果发现触发器引用 md.car_number,执行:

-- 删除有问题的触发器
DROP TRIGGER IF EXISTS trigger_name;

-- 示例:如果发现 delivery_after_insert 触发器有问题
-- DROP TRIGGER IF EXISTS delivery_after_insert;

步骤 4: 删除字段

确认没有依赖后,执行字段删除:

-- 删除 car_number 字段
ALTER TABLE member_driver DROP COLUMN IF EXISTS car_number;

-- 验证删除
DESC member_driver;

步骤 5: 重启服务

# 1. 清理编译缓存
cd C:\cattleTransport\tradeCattle
Remove-Item -Recurse -Force target -ErrorAction SilentlyContinue

# 2. 停止后端服务(在运行服务的终端按 Ctrl+C

# 3. 重新启动服务
cd aiotagro-cattle-trade
mvn spring-boot:run

⚠️ 重要注意事项

1. 数据备份

在删除字段前,务必备份数据库:

-- 导出整个数据库
mysqldump -u root -p cattle_trade > cattle_trade_backup_$(date +%Y%m%d).sql

-- 或只备份 member_driver 表
mysqldump -u root -p cattle_trade member_driver > member_driver_backup_$(date +%Y%m%d).sql

2. 数据迁移

如果 member_driver 表的 car_number 字段中有重要数据,需要先迁移到 vehicle 表:

-- 检查是否有数据
SELECT id, username, car_number 
FROM member_driver 
WHERE car_number IS NOT NULL AND car_number != '';

-- 迁移数据到 vehicle 表(根据实际情况调整)
-- INSERT INTO vehicle (license_plate, ...) 
-- SELECT DISTINCT car_number, ... FROM member_driver WHERE car_number IS NOT NULL;

3. 代码已同步

以下代码文件已经移除了对 car_number 的引用:

  • MemberDriverMapper.java - 所有 SQL 查询已移除 car_number
  • MemberController.java - 新增/更新司机时不再使用 car_number
  • DeliveryServiceImpl.java - 不再从司机表查询车牌号
  • XqClientMapper.java - 从 delivery 表获取 license_plate
  • JbqClientMapper.xml - 从 delivery 表获取 license_plate

🎯 预期结果

执行完成后:

  1. member_driver 表不再包含 car_number 字段
  2. 创建运送清单时不会报 Unknown column 'md.car_number' 错误
  3. 车牌号信息从 vehicle 表获取,通过 delivery.license_plate 关联
  4. 司机和车辆是完全独立的两个模块

🔧 故障排查

如果删除字段后仍然报错:

  1. 清除 MyBatis 缓存

    Remove-Item -Recurse -Force target
    
  2. 检查是否有其他地方引用

    # 在项目中搜索 car_number
    grep -r "car_number" tradeCattle/aiotagro-cattle-trade/src/
    
  3. 重启数据库连接池

    • 完全停止 Spring Boot 应用
    • 等待 30 秒让连接池清空
    • 重新启动应用

📞 联系方式

如果遇到问题,请提供:

  1. 诊断脚本的完整输出
  2. 触发器的定义(如果有)
  3. 错误日志的完整堆栈跟踪

文档版本: 1.0
创建日期: 2025-10-29
最后更新: 2025-10-29