mysql设置默认值无效问题及解决

 更新时间:2023年10月18日 10:47:47   作者:柠檬不酸(LemonSour)  
这篇文章主要介绍了mysql设置默认值无效问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

场景

  • 数据库mysql
  • 框架hibernate

原因

根据hibernate打印出的sql信息可以发现,如果实体类字段为null,则仍会insert这个字段为null,而mysql设置的默认值生效的前提是,

当我们insert一条记录时,我们不指定某字段的值,他才会自动生成默认值,

而我们用save的时候指定该字段的值为null,此时如果我们mysql设置的为not null,那么同时也会报错

解决

  • @DynamicInsert(默认为true)
  • @DynamicUpdate(默认为true)

这两个注解是类注解,作用为:

当插入/更新一条记录时,只insert/update改变的信息,而不是将所有字段都update为当前的

即,没有注解时update的sql为

Hibernate: select student0_.id as id1_0_0_, student0_.default_value as default_2_0_0_, student0_.password as password3_0_0_, student0_.username as username4_0_0_ from user_student student0_ where student0_.id=? Hibernate: update user_student set default_value=?, password=?, username=? where id=?

有注解时的sql为

Hibernate: select student0_.id as id1_0_0_, student0_.default_value as default_2_0_0_, student0_.password as password3_0_0_, student0_.username as username4_0_0_ from user_student student0_ where student0_.id=?
Hibernate: update user_student set username=? where id=?

可以看到,当需要update时(如果没有做更改则无论有无注解均不会执行update命令),无注解的将所有字段全都update为当前值,有注解的则只update修改值。

在每次update之前,均会执行select查询出数据库当前该字段的状态进行比较后在执行更新操作

网上有人说@DynamicInsert这个注解的作用是,如果值为null,则不set该值。

从片面的角度来看,这句话是对的,如果我们在save时指定id,因为insert对于一条记录只会出现一次,在执行insert之前,hibernate回去数据库执行select查询,如果查询不到数据,那么我们当前值的null和他当前缓存种的值null是相等的,就认为该值没有修改,在后面执行insert时mysql就会给该值赋予默认值。

如果我们没指定id,那么他就不会select,同理,跟缓存中的null相等,在组建insert语句时就不会附带该值

那么有这么一种情况,假若我们save了一个新记录,然后又update该记录,但是在update时,有个字段我们没有赋值,其为null,那么跟从数据库select出的数据发生了变化,就会set null向数据库中,此时如果我们数据库时not null的,就会报错,反之,则会该字段的值被设为了null

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL数据库之联合查询 union

    MySQL数据库之联合查询 union

    这篇文章主要介绍了MySQL数据库之联合查询 union,联合查询就是将多个查询结果的结果集合并到一起,字段数不变,多个查询结果的记录数合并,下文详细介绍需要的小伙伴可以参考一下
    2022-06-06
  • Mysql连接join查询原理知识点

    Mysql连接join查询原理知识点

    在本文里我们给大家整理了一篇关于Mysql连接join查询原理知识点文章,对此感兴趣的朋友们可以学习下。
    2019-02-02
  • MySQL 两种恢复数据的方法

    MySQL 两种恢复数据的方法

    这篇文章主要介绍了MySQL 两种恢复数据的方法,帮助恢复线上数据,保证数据完整,感兴趣的朋友可以了解下
    2020-10-10
  • mysql count()函数不计算null和空值问题

    mysql count()函数不计算null和空值问题

    这篇文章主要介绍了mysql count()函数不计算null和空值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • mysql拆分字符串作为查询条件的示例代码

    mysql拆分字符串作为查询条件的示例代码

    本文主要介绍了mysql拆分字符串作为查询条件的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • MySQL如何选择合适的索引

    MySQL如何选择合适的索引

    这篇文章主要介绍了MySQL如何选择合适的索引,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • SQL实现LeetCode(181.员工挣得比经理多)

    SQL实现LeetCode(181.员工挣得比经理多)

    这篇文章主要介绍了SQL实现LeetCode(181.员工挣得比经理多),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • mysql5.6.8源码安装过程

    mysql5.6.8源码安装过程

    这篇文章主要介绍了mysql5.6.8源码安装过程,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-01-01
  • mysql 8.0.18 压缩包安装及忘记密码重置所遇到的坑

    mysql 8.0.18 压缩包安装及忘记密码重置所遇到的坑

    这篇文章主要介绍了mysql 8.0.18 压缩包安装及忘记密码重置所遇到的坑,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • Linux下安装mysql-5.6.12-linux-glibc2.5-x86_64.tar.gz

    Linux下安装mysql-5.6.12-linux-glibc2.5-x86_64.tar.gz

    这篇文章主要介绍了Linux下安装mysql-5.6.12-linux-glibc2.5-x86_64.tar.gz的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09

最新评论