背景
系统中的某个实体表字段值为null时,其实表示的是无限大,但是当对其进行数量过滤时,又被过滤掉了,所以想给字段一个很大的默认值来解决这个问题。
解决方法
- 第一步:将所有的null值更新赋值为默认值,执行一条sql即可
update tb_discount set discount_count = 100000 where discount_count is null
- 第二步:设置指定字段默认值,也是执行一条sql即可
alter table tb_discount modify column discount_count int(8) default 100000 comment '优惠券领取数量'
- 第三步:出入验证,验证失败,当discount_count 为空时,并没有将100000作为默认值插入
思考:数据库默认值的使用场景是,当不对字段进行声明插入时,即使用默认值插入。
我用的是Mybatis,插入语句如下:<insert id="insert">
INSERT INTO tb_discount(
id,
draw_cycle,
discount_count,
customer_flag,
user_max_count,
putaway_flag,
discount_use_flag,
discount_grant_flag
) VALUES (
#{id},
#{drawLimitType},
#{drawCycle},
#{discountCount},
#{customerFlag},
#{userMaxCount},
#{putawayFlag},
#{discountUseFlag},
#{discountGrantFlag}
)
</insert>
**原因找到了,insert语句是全字段声明式插入,所以即使某个字段为空,它也不会使用数据库中的默认值**
- 第四步:在实体bean中设置字段的默认值
当时是脑子蒙圈了,一心想着肯定有某个注解能给字段使用默认值,后来同事提醒才恍然大悟,直接给字段赋值就行了。如此简单而已private Integer discountCount = 100000;
- 第五步:验证通过
总结
- 其实这个默认值只是一个很小的知识点,但是没有深入的理解,才导致这样的问题,使用的场景很重要。
- 那在Mybatis中是不是要想使用默认值,就不在insert中声明呢,不是这样的,其实还可以使用动态语句,对字段进行非空判断,然后再执行默认值插入,所以应该是有两套解决方案的。