4.3 KiB
4.3 KiB
member_driver 表 car_number 字段删除指南
🔍 问题诊断
错误现象
java.sql.SQLSyntaxErrorException: Unknown column 'md.car_number' in 'field list'
这个错误在执行 DeliveryMapper.insert 时出现,但 INSERT SQL 本身并不包含 md.car_number。
可能原因
- 数据库触发器 - delivery 表的 INSERT/UPDATE 触发器可能引用了 member_driver.car_number
- 数据库视图 - 某个视图可能包含 member_driver.car_number
- 字段仍然存在 - 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
🎯 预期结果
执行完成后:
- ✅
member_driver表不再包含car_number字段 - ✅ 创建运送清单时不会报
Unknown column 'md.car_number'错误 - ✅ 车牌号信息从
vehicle表获取,通过delivery.license_plate关联 - ✅ 司机和车辆是完全独立的两个模块
🔧 故障排查
如果删除字段后仍然报错:
-
清除 MyBatis 缓存
Remove-Item -Recurse -Force target -
检查是否有其他地方引用
# 在项目中搜索 car_number grep -r "car_number" tradeCattle/aiotagro-cattle-trade/src/ -
重启数据库连接池
- 完全停止 Spring Boot 应用
- 等待 30 秒让连接池清空
- 重新启动应用
📞 联系方式
如果遇到问题,请提供:
- 诊断脚本的完整输出
- 触发器的定义(如果有)
- 错误日志的完整堆栈跟踪
文档版本: 1.0
创建日期: 2025-10-29
最后更新: 2025-10-29