# 数据库字段缺失问题修复指南 ## 🐛 问题描述 错误信息: ``` 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 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. 如有必要,联系技术支持团队 修复完成后,优惠券状态管理功能应该可以正常使用!