小程序开发-服务端
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

数据库字段缺失问题修复指南

🐛 问题描述

错误信息:

java.sql.SQLSyntaxErrorException: Unknown column 'goods_id' in 'field list'

原因: 数据库表 shop_coupon_apply_item 中缺少 goods_idcategory_id 字段,但代码中尝试查询这些字段。

🔧 解决方案

方案一:执行数据库修复脚本(推荐)

  1. 备份数据库(重要!)
mysqldump -u username -p database_name > backup_$(date +%Y%m%d_%H%M%S).sql
  1. 执行修复脚本
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;

🚨 注意事项

  1. 数据备份: 执行任何数据库修改前必须备份
  2. 停机时间: 建议在低峰期执行修复
  3. 测试环境: 先在测试环境验证修复效果
  4. 回滚计划: 准备回滚方案以防出现问题

🔄 回滚方案

如果修复后出现问题,可以回滚:

-- 删除新添加的字段
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接口正常
  • 检查了应用日志无错误
  • 验证了优惠券功能正常

📞 技术支持

如果在修复过程中遇到问题,请:

  1. 检查数据库连接和权限
  2. 确认SQL语法与MySQL版本兼容
  3. 查看详细的错误日志
  4. 如有必要,联系技术支持团队

修复完成后,优惠券状态管理功能应该可以正常使用!