一、问题背景最近在做一个采购系统的重新提交功能。业务场景是采购员退回采购单后删除 1 个物资明细重新提交。我需要把被前端删除的明细从 task 上解绑——回退到待处理状态。具体来说- source_task_id 设为 null解除与当前 task 的关联- demand_pool_status 设为 0回到待处理- 等等字段诡异的现象 - updateById 返回 rows1 看起来更新成功了- 解绑后 demandPoolStatus0 生效了 待处理状态变更成功- 但 sourceTaskId 还是原来的值 没被解绑二、排查过程MyBatis-Plus 的 updateById 默认使用 FieldStrategy.NOT_NULL 策略 ——当字段值为 null 时 不会 包含到 UPDATE SQL 中。detail.setSourceTaskId(null); detail.setDemandPoolStatus(0); detailMapper.updateById(detail);生成的 SQL 是UPDATE zdk_purchase_detail SET demand_pool_status 0, flow_status 1, current_stage 2 WHERE id ?没有 SET source_task_id NULL 这部分所以 source_task_id 在 DB 中保持原值。三、解决方案方案 1使用 UpdateWrapper.set(field, null) 强制更新推荐UpdateWrapperZdkPurchaseDetail uw new UpdateWrapper(); uw.eq(id, detailId); uw.set(source_task_id, null); uw.set(source_stage_id, null); uw.set(demand_pool_status, 0); uw.set(flow_status, 1); uw.set(current_stage, 2); uw.set(audit_quantity, null); uw.set(delivery_info, null); uw.set(payment_terms, null); zdkPurchaseDetailMapper.update(null, uw);原理 UpdateWrapper.set(field, null) 会 强制 生成 SET field NULL 的 SQL绕开 FieldStrategy.NOT_NULL 的检查。方案 2字段级配置 TableField 注解TableField(value source_task_id, updateStrategy FieldStrategy.IGNORED) private String sourceTaskId;适用场景 单个字段频繁需要 set null。方案 3全局配置 application.ymlmybatis-plus: global-config: db-config: field-strategy: ignored