MySQL设置有默认值但插入数据为什么变为了null?

情景复现:

本周我在观察前不久自己上线的几个功能是否正常运行时,发现了一个奇怪的点,在开发的时候,我在某个SQL表中给某个字段设置了默认值,但是这个字段最终录入的数据都是NULL。我直接好家伙,这下我又写了个BUG出来!!!

这可不是期望中的结果。下面我用一个例子对情景进行复现。

创建一个employee表:

create table employee
(
    id          bigint auto_increment not null comment '主键' primary key,
    work_number varchar(30)           null comment '工号',
    name        varchar(255)          null comment '姓名',
    gender      char(2) default '男'   null comment '性别:默认 男'
);

这里我们可以看见我在给gender字段设置了默认值。我在用持久化工具mybatis对数据进行insert操作时,gender并没有传值。这时候我的预期是gender会默认赋值为。但实际并没有。

问题分析:

1、 这时候我就用SQL进行了一个分析,首先我先进行了一次insert操作

# 未指定gender
insert into employee(work_number, name) VALUES ('001', '小超');

得到下面的结果:

在这里插入图片描述

说明,我没给gender传值时且插入时并没指定gender字段时,MySQL会自动给gender插入默认值。

2、 接着我进行第二次insert操作,这次我插入时指定了gender字段。但是我没有传值,赋了一个null(实际应该叫赋了一个null值)

# 指定gender为null
insert into employee(work_number, name, gender)values ('002', '小超', null)

得到下面的结果:

在这里插入图片描述

3、 结论

说明我在用MyBatis做insert插入操作时,进行了第二种操作。我在插入数据时传入的是整个Employee实体对象,但是在实体对象中gender我并没有给它赋值,这样就会出现一个问题,当实体对象中某个属性值为空时,对应的数据库的字段就会插入null值,而默认值是插入时不指定该字段,该字段的值才会取默认值。所以相当于我给设置了默认值的字段插入了一个null值,因此就不会插入默认值了。

解决方案:

这里我给出两个解决方案,根据不同的应用场景采用对应的方案。

No 1. 采用mybatis 的insert操作,但是不指定gender字段(不推荐)
该方案可以让你在插入操作时取默认值,但是插入时只能取默认值,取不了其他值,只有在后续的update操作中才能取到其他值,不适合在插入时还有其他值的应用场景。

No 2.采用mybatis 的insertSelective操作(推荐)
insertSelective操作生成的insert语句中字段是动态生成的,如果你传入的实体对象中的属性值为null时,生成的insert语句就不会指定该字段,从而插入的时候,如果字段设置了默认值会直接取默认值。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐