Files
java-10561/docs/DATABASE_FIELD_MISSING_FIX.md
2025-09-06 11:58:18 +08:00

191 lines
4.9 KiB
Markdown
Raw Permalink 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.

# 数据库字段缺失问题修复指南
## 🐛 问题描述
错误信息:
```
java.sql.SQLSyntaxErrorException: Unknown column 'goods_id' in 'field list'
```
**原因**: 数据库表 `shop_coupon_apply_item` 中缺少 `goods_id``category_id` 字段,但代码中尝试查询这些字段。
## 🔧 解决方案
### 方案一:执行数据库修复脚本(推荐)
1. **备份数据库**(重要!)
```bash
mysqldump -u username -p database_name > backup_$(date +%Y%m%d_%H%M%S).sql
```
2. **执行修复脚本**
```bash
mysql -u username -p database_name < src/main/resources/sql/simple_fix_coupon_table.sql
```
或者手动执行以下SQL
```sql
-- 添加缺失的字段
ALTER TABLE shop_coupon_apply_item
ADD COLUMN goods_id INT(11) NULL COMMENT '商品ID' AFTER coupon_id;
ALTER TABLE shop_coupon_apply_item
ADD COLUMN category_id INT(11) NULL COMMENT '分类ID' AFTER goods_id;
-- 添加索引
CREATE INDEX idx_coupon_apply_item_goods ON shop_coupon_apply_item(coupon_id, goods_id);
CREATE INDEX idx_coupon_apply_item_category ON shop_coupon_apply_item(coupon_id, category_id);
CREATE INDEX idx_coupon_apply_item_type ON shop_coupon_apply_item(coupon_id, type);
-- 检查表结构
DESCRIBE shop_coupon_apply_item;
```
### 方案二:临时代码修复(已实施)
我已经修改了 `CouponStatusServiceImpl.java` 中的代码,添加了异常处理:
```java
try {
// 尝试查询 goods_id 字段
List<ShopCouponApplyItem> applyItems = shopCouponApplyItemService.list(...);
// 处理逻辑
} catch (Exception e) {
log.warn("查询优惠券适用商品失败,可能是数据库字段不存在: {}", e.getMessage());
// 如果查询失败默认返回true允许使用
return true;
}
```
## 📋 修复步骤
### 1. 立即修复(临时方案)
- ✅ 已修改代码添加异常处理
- ✅ 使用 `pk` 字段作为临时的商品ID
- ✅ 查询失败时默认允许使用优惠券
### 2. 完整修复(推荐执行)
#### 步骤1停止应用
```bash
# 如果使用Docker
docker-compose down
# 或者直接停止Java进程
pkill -f java
```
#### 步骤2备份数据库
```bash
mysqldump -u root -p your_database > backup_$(date +%Y%m%d_%H%M%S).sql
```
#### 步骤3执行数据库修复
```bash
mysql -u root -p your_database < src/main/resources/sql/simple_fix_coupon_table.sql
```
#### 步骤4验证修复
```sql
-- 检查表结构
DESCRIBE shop_coupon_apply_item;
-- 应该看到以下字段:
-- id, coupon_id, goods_id, category_id, type, pk, status, deleted, tenant_id, create_time, update_time
```
#### 步骤5重启应用
```bash
# 如果使用Docker
docker-compose up -d
# 或者直接启动
java -jar your-app.jar
```
## 🧪 测试验证
### 1. 检查API接口
```bash
# 测试优惠券列表查询
curl -X GET "http://localhost:9200/api/shop/user-coupon/my/available"
# 测试优惠券验证
curl -X POST "http://localhost:9200/api/shop/coupon-status/validate" \
-H "Content-Type: application/json" \
-d '{"userCouponId":1,"totalAmount":150.00,"goodsIds":[1,2,3]}'
```
### 2. 检查日志
```bash
# 查看应用日志
tail -f logs/application.log
# 查找相关错误
grep -i "goods_id\|SQLSyntaxErrorException" logs/application.log
```
## 📊 数据迁移(可选)
如果表中已有数据,可能需要迁移:
```sql
-- 如果原来使用 pk 字段存储商品ID
UPDATE shop_coupon_apply_item
SET goods_id = pk
WHERE type = 1 AND pk IS NOT NULL AND goods_id IS NULL;
-- 如果原来使用其他字段存储分类ID
-- UPDATE shop_coupon_apply_item
-- SET category_id = some_other_field
-- WHERE type = 2 AND some_other_field IS NOT NULL AND category_id IS NULL;
```
## 🚨 注意事项
1. **数据备份**: 执行任何数据库修改前必须备份
2. **停机时间**: 建议在低峰期执行修复
3. **测试环境**: 先在测试环境验证修复效果
4. **回滚计划**: 准备回滚方案以防出现问题
## 🔄 回滚方案
如果修复后出现问题,可以回滚:
```sql
-- 删除新添加的字段
ALTER TABLE shop_coupon_apply_item DROP COLUMN goods_id;
ALTER TABLE shop_coupon_apply_item DROP COLUMN category_id;
-- 删除新添加的索引
DROP INDEX idx_coupon_apply_item_goods ON shop_coupon_apply_item;
DROP INDEX idx_coupon_apply_item_category ON shop_coupon_apply_item;
DROP INDEX idx_coupon_apply_item_type ON shop_coupon_apply_item;
```
或者直接恢复备份:
```bash
mysql -u root -p your_database < backup_20250115_143000.sql
```
## ✅ 修复完成检查清单
- [ ] 数据库已备份
- [ ] 执行了字段添加脚本
- [ ] 验证了表结构正确
- [ ] 重启了应用
- [ ] 测试了API接口正常
- [ ] 检查了应用日志无错误
- [ ] 验证了优惠券功能正常
## 📞 技术支持
如果在修复过程中遇到问题,请:
1. 检查数据库连接和权限
2. 确认SQL语法与MySQL版本兼容
3. 查看详细的错误日志
4. 如有必要,联系技术支持团队
修复完成后,优惠券状态管理功能应该可以正常使用!