11
This commit is contained in:
190
docs/DATABASE_FIELD_MISSING_FIX.md
Normal file
190
docs/DATABASE_FIELD_MISSING_FIX.md
Normal file
@@ -0,0 +1,190 @@
|
||||
# 数据库字段缺失问题修复指南
|
||||
|
||||
## 🐛 问题描述
|
||||
|
||||
错误信息:
|
||||
```
|
||||
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. 如有必要,联系技术支持团队
|
||||
|
||||
修复完成后,优惠券状态管理功能应该可以正常使用!
|
||||
Reference in New Issue
Block a user