业务跑完后数据库数据校验 📅 发布时间:2026/8/27 20:27:20 👁 浏览次数: 业务跑完后数据库数据校验业务流程执行完毕接口/脚本/手工操作跑完业务数据库校验核心目标数据落库正确、关联完整、状态流转无误、无脏数据、无多余/缺失记录、事务一致性符合业务规则不只看单表有没有插入成功要从单表、关联表、业务逻辑、事务、边界、历史数据、性能副作用多层校验。前提执行业务前做好数据快照/基线记录前置状态业务执行完成后先确认业务链路返回成功再做DB校验避免业务失败还去校验数据库。一、基础单表校验单张业务表1.记录条数校验新增场景预期新增N条实际count是否等于N不能只看0要精确数量。selectcount(*)fromt_xxxwhere业务唯一标识业务id;更新场景记录条数不变行数不新增禁止出现重复行。删除场景记录消失 / 标记删除逻辑删除看delete_flag。坑批量业务容易多插、漏插count不等于预期就是bug。2.字段值校验核心分4类字段逐个核对业务业务字段业务传入的值落库后是否一致金额、名称、状态、类型重点金额、数量禁止直接用等于浮点比较decimal类型校验时间字段时区问题前端传入时间和数据库时间是否偏差。状态流转字段业务跑完后status必须落到业务终态不能停留在中间态。例订单提交后status1支付完成status2不能还是1。系统内置字段create_time、update_time、create_by、update_byinsertcreate_time有值update_timecreate_timeupdateupdate_time必须大于原始create_time不能不变非空/默认值字段not null字段不能null有默认值字段不传参是否写入默认值。3.唯一性校验唯一索引业务键跑完业务不能产生重复数据。selectbusiness_id,count(*)fromt_xxxgroupbybusiness_idhavingcount(*)1;查出结果代表重复脏数据。二、多表关联校验业务最容易漏测绝大多数业务数据分布多张表主表、子表、明细表、关联表、流水表、日志表。原则主表和子表数据必须成对出现不能孤儿数据主→子表一对多例子订单主表t_order订单明细表t_order_item主表存在子表必须有对应明细子表不能存在没有主表id的孤儿记录-- 找孤儿明细有明细没有主订单select*fromt_order_item itemleftjoint_order oonitem.order_ido.order_idwhereo.order_idisnull;流水/变更记录表校验业务操作会写流水表支付流水、操作日志。执行一次业务应该生成几条流水流水状态、关联ID、操作类型是否正确不能重复生成多条流水也不能漏流水。3.字典关联校验表中存字典编码确认编码合法不存在垃圾编码值。selectstatusfromt_orderwherestatusnotin(selectcodefromdict_order_status);三、事务一致性校验重中之重测试高频bug点业务是一个事务要么全部成功要么全部回滚。场景业务接口返回异常/超时校验数据库不能出现半成功数据典型bug主表插入成功子表插入失败事务没回滚产生半残业务数据。校验点业务成功所有关联表数据全部落库业务失败所有关联表无新增/无变更数据和执行前基线完全一致。实操业务抛出异常之后对比执行前后快照不允许有任何表数据改动。四、业务逻辑校验不能只看字段字面要看业务规则很多问题不是字段值错是业务逻辑不符合规则。举例订单实付金额 商品总金额‑优惠金额不能只校验实付存了100要校验等式成立。库存扣减跑完下单库存 原始库存‑下单数量。余额扣减扣减后余额不能为负数。状态约束状态A不能直接跳到状态D校验数据库不会出现非法状态组合。写法直接写SQL做业务等式校验不要select出来肉眼看。select*fromt_orderwhereactual_amounttotal_amount‑discount_amount;查询出数据代表业务逻辑错误。五、逻辑删除 vs 物理删除校验逻辑删除update设置delete_flag1记录不能消失原始数据保留不能真delete。查询业务不能查出已删除数据。物理删除表中该记录彻底消失count0。坑很多开发逻辑删除写成物理删除或者删除后还能被业务查询出来。六、历史旧数据影响校验跑完新业务不能污染历史老数据。只修改本次业务对应的业务ID不能把其他用户、其他订单数据更新。SQL校验业务id之外的旧数据执行前后值完全不变。七、特殊类型字段专项校验字段类型校验要点decimal金额禁止精度丢失0.10.2不等于0.3核对小数位不要浮点数比对datetime/timestamp时区毫秒是否丢失更新时间是否正确变更varchar字符串前后空格、特殊字符、超长截断入参超长是否被截断json类型json字段key不能缺失value正确json结构完整不要存字符串nullbigint大数值防止溢出八、兜底校验脏数据巡检业务跑完执行几条巡检SQL快速扫异常找nullnot null字段出现nullselect*fromt_xxxwherecolisnull;非法状态不在业务允许枚举值孤儿数据外键关联不到主表时间异常update_time create_time金额负数业务不允许负数的字段查出负数九、自动化校验思路数据库测试落地执行业务前对本次业务id做快照把表数据导出/落临时校验表触发业务流程通过SQL断言行数、字段值、关联关系、业务等式断言失败直接抛出缺陷不用人工肉眼核对。十、常见踩坑总结只校验主表漏校验子表、流水表漏测孤儿数据只看接口返回成功忽略事务部分成功金额直接用程序浮点数对比出现精度问题只校验新增不校验没有被本次业务影响的历史数据被误更新时间时区问题数据库时间和业务预期差8小时json字段只校验部分key忽略key丢失逻辑删除校验不到位删了还能查到。