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

158 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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` 脚本的**诊断部分**
```bash
# 连接到数据库
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`,执行:
```sql
-- 删除有问题的触发器
DROP TRIGGER IF EXISTS trigger_name;
-- 示例:如果发现 delivery_after_insert 触发器有问题
-- DROP TRIGGER IF EXISTS delivery_after_insert;
```
### 步骤 4: 删除字段
确认没有依赖后,执行字段删除:
```sql
-- 删除 car_number 字段
ALTER TABLE member_driver DROP COLUMN IF EXISTS car_number;
-- 验证删除
DESC member_driver;
```
### 步骤 5: 重启服务
```powershell
# 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. 数据备份
在删除字段前,务必备份数据库:
```sql
-- 导出整个数据库
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 表:
```sql
-- 检查是否有数据
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 缓存**
```powershell
Remove-Item -Recurse -Force target
```
2. **检查是否有其他地方引用**
```bash
# 在项目中搜索 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