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配置文件的使用教程

    mysql配置文件的使用教程

    这篇文章主要介绍了mysql配置文件的使用教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-10-10
  • MySQL备份Shell脚本的实现

    MySQL备份Shell脚本的实现

    本文主要介绍了Shell脚本来自动备份MySQL数据库,脚本会备份指定数据库或所有数据库,按日期命名备份文件以防止覆盖,并自动删除N天前的旧备份以节省空间,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • 详解MySQL中的事务与ACID特性

    详解MySQL中的事务与ACID特性

    这篇文章主要为大家介绍了Mysql 中的事务,包括事务的基本概念和 ACID 特性、事务的隔离级别和具体实现方法等,并提供相应的代码示例,希望对大家有所帮助
    2023-05-05
  • sqoop export导出 map100% reduce0% 卡住的多种原因及解决

    sqoop export导出 map100% reduce0% 卡住的多种原因及解决

    这篇文章主要介绍了sqoop export导出 map100% reduce0% 卡住的多种原因及解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Mysql IO 内存方面的优化

    Mysql IO 内存方面的优化

    这篇文章主要介绍了Mysql IO 内存方面的优化 的相关资料,需要的朋友可以参考下
    2016-01-01
  • mysql 导入导出数据库、数据表的方法

    mysql 导入导出数据库、数据表的方法

    这篇文章主要介绍了mysql 导入导出数据库、数据表的方法,有需要的朋友可以参考一下
    2013-11-11
  • Mysql8主从复制解读(兼容低高版本)

    Mysql8主从复制解读(兼容低高版本)

    文章详细介绍了MySQL主从复制的理论知识、必要前提、实现原理、binlog的三种类型以及主从同步的具体步骤,通过配置主库和从库的MySQL配置文件,并创建用于主从同步的用户,可以实现主从复制,最后,文章还讨论了主从同步的验证和故障切换的方法
    2025-02-02
  • MySQL触发器的使用和优缺点介绍

    MySQL触发器的使用和优缺点介绍

    大家好,本篇文章主要讲的是MySQL触发器的使用和优缺点介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下哦,方便下次浏览
    2021-12-12
  • mysql 联合索引生效的条件及索引失效的条件

    mysql 联合索引生效的条件及索引失效的条件

    两个或更多个列上的索引被称作复合索引,本文主要介绍了mysql 联合索引生效的条件及索引失效的条件,感兴趣的可以了解一下
    2021-11-11
  • mysql中的各种约束条件深入探讨

    mysql中的各种约束条件深入探讨

    在mysql中对编辑的数据进行类型的限制,不满足约束条件的报错,本文给大家分享mysql中的各种约束条件,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-05-05

最新评论