You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4.9 KiB
4.9 KiB
数据库字段缺失问题修复指南
🐛 问题描述
错误信息:
java.sql.SQLSyntaxErrorException: Unknown column 'goods_id' in 'field list'
原因: 数据库表 shop_coupon_apply_item
中缺少 goods_id
和 category_id
字段,但代码中尝试查询这些字段。
🔧 解决方案
方案一:执行数据库修复脚本(推荐)
- 备份数据库(重要!)
mysqldump -u username -p database_name > backup_$(date +%Y%m%d_%H%M%S).sql
- 执行修复脚本
mysql -u username -p database_name < src/main/resources/sql/simple_fix_coupon_table.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
中的代码,添加了异常处理:
try {
// 尝试查询 goods_id 字段
List<ShopCouponApplyItem> applyItems = shopCouponApplyItemService.list(...);
// 处理逻辑
} catch (Exception e) {
log.warn("查询优惠券适用商品失败,可能是数据库字段不存在: {}", e.getMessage());
// 如果查询失败,默认返回true(允许使用)
return true;
}
📋 修复步骤
1. 立即修复(临时方案)
- ✅ 已修改代码添加异常处理
- ✅ 使用
pk
字段作为临时的商品ID - ✅ 查询失败时默认允许使用优惠券
2. 完整修复(推荐执行)
步骤1:停止应用
# 如果使用Docker
docker-compose down
# 或者直接停止Java进程
pkill -f java
步骤2:备份数据库
mysqldump -u root -p your_database > backup_$(date +%Y%m%d_%H%M%S).sql
步骤3:执行数据库修复
mysql -u root -p your_database < src/main/resources/sql/simple_fix_coupon_table.sql
步骤4:验证修复
-- 检查表结构
DESCRIBE shop_coupon_apply_item;
-- 应该看到以下字段:
-- id, coupon_id, goods_id, category_id, type, pk, status, deleted, tenant_id, create_time, update_time
步骤5:重启应用
# 如果使用Docker
docker-compose up -d
# 或者直接启动
java -jar your-app.jar
🧪 测试验证
1. 检查API接口
# 测试优惠券列表查询
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. 检查日志
# 查看应用日志
tail -f logs/application.log
# 查找相关错误
grep -i "goods_id\|SQLSyntaxErrorException" logs/application.log
📊 数据迁移(可选)
如果表中已有数据,可能需要迁移:
-- 如果原来使用 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;
🚨 注意事项
- 数据备份: 执行任何数据库修改前必须备份
- 停机时间: 建议在低峰期执行修复
- 测试环境: 先在测试环境验证修复效果
- 回滚计划: 准备回滚方案以防出现问题
🔄 回滚方案
如果修复后出现问题,可以回滚:
-- 删除新添加的字段
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;
或者直接恢复备份:
mysql -u root -p your_database < backup_20250115_143000.sql
✅ 修复完成检查清单
- 数据库已备份
- 执行了字段添加脚本
- 验证了表结构正确
- 重启了应用
- 测试了API接口正常
- 检查了应用日志无错误
- 验证了优惠券功能正常
📞 技术支持
如果在修复过程中遇到问题,请:
- 检查数据库连接和权限
- 确认SQL语法与MySQL版本兼容
- 查看详细的错误日志
- 如有必要,联系技术支持团队
修复完成后,优惠券状态管理功能应该可以正常使用!