MySQL设置有默认值但插入数据为什么变为了null?
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语句就不会指定该字段,从而插入的时候,如果字段设置了默认值会直接取默认值。