SQLIntegrityConstraintViolationException: Column ‘create_time‘ cannot be null

这篇具有很好参考价值的文章主要介绍了SQLIntegrityConstraintViolationException: Column ‘create_time‘ cannot be null。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

在使用MySQL + MyBatis时遇到的问题,记录一下。

问题

在测试环境里,往MySQL数据表里插入数据时报错:SQLIntegrityConstraintViolationException: Column 'create_time' cannot be null

表结构字段定义:

create_time datetime default CURRENT_TIMESTAMP not null comment '创建日期',

备注:
MySQL数据库版本:

select version();
5.7.30

使用的MyBatis版本:

<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.0.3</version>
</dependency>

使用的MySQL驱动版本:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.15</version>
</dependency>

排查

参考mysql-insert-error-cannot-be-null-datetime-not-null-default-current-timestamp。

给出的解释是:

The MySQL 5.7 manual states that…

In addition, you can initialize or update any TIMESTAMP column to the current date and time by assigning it a NULL value, unless it has been defined with the NULL attribute to permit NULL values.

The manual does not say you can do this for DATETIME fields.

简单翻译下,就是TIMESTAMP字段能够实现插入当前时间,datetime字段则不一定能保证。

修改测试环境下的表结构定义语句:

create_time timestamp default CURRENT_TIMESTAMP not null comment '创建日期',

stackoverflow还是非常靠谱,问题解决。

datetime & timestamp

相同:都可以表示YYYY-MM-DD HH:MM:SS这种年月日时分秒格式的数据。MySQL5.6.4之前,都不能表示小数。MySQL5.6.4后这两者都可以包含秒后的小数部分,精度最高为微妙(6位)

不同:

  • 存储范围
    datetime的存储范围是1000-01-01 00:00:00.0000009999-12-31 23:59:59.999999,而timestamp的范围是1970-01-01 00:00:01.0000002038-01-19 03:14:07.999999(准备的来讲应该是UTC范围);
  • 时区
    datetime存储与时区无关(准备来说是datetime只支持一个时区,即存储时当前服务器的时区),而timestamp存储的是与时区有关。
    MySQL在存储TIMESTAMP时,会先将时间从当前服务器的时区转换为UTC(世界协调时)以进行存储,然后查询时从UTC转换为当前时区以进行返回。也就是说使用timestamp进行存储的时间返回的时候会随着数据库的时区而发生改变。而datetime的存储则与时区无关,数据是什么就存储什么,也就返回什么
  • 存储大小
    在5.6.4之前,datetime存储占用8个字节,而timestamp是占用4字节;但是在5.6.4之后,由于这两个类型允许有小数部分,所以占用的存储空间和以前不同;
    MySQL规范规定,datetime的非小数部分需要5个字节,而不是8个字节,而timestamp的非小数部分是需要4个字节,并且这两个部分的小数部分都需要0到3个字节,具体取决于存储值的小数秒精度

反思

除上面的create_time字段在insert到数据库时没有设置系统当前时间,另外还有一个字段is_delete也有类似问题:

is_delete       int(1)      default 0                 null comment '是否删除 0-未删除 1-已删除',

SQLIntegrityConstraintViolationException: Column ‘create_time‘ cannot be null
理论上代码层面没有设置is_delete时,落到数据库时使用default值,即0。

这就很懵逼啊,代码就那么几行。

突然发现使用的时MyBatis的insert方法,而没有使用insertSelective方法。

insert & insertSelective

insert这个API转化成XML语法如下:

<insert id="insert">
INSERT INTO merchant_app(id,is_delete,create_time) values (#{id,jdbcType=BIGINT}, #{isDelete,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP})
</insert>

转换成SQL如下:

INSERT INTO merchant_app(id,is_delete,create_time) VALUES( ?,?,? )

insertSelective这个API转化成XML语法如下:

insert into HSP_MEDIA_INF
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        id,
      </if>
      <if test="isDelete != null" >
        is_delete,
      </if>
      <if test="createTime != null" >
        create_time,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        #{id,jdbcType=BIGINT},
      </if>
      <if test="isDelete != null" >
        #{isDelete,jdbcType=INTEGER},
      </if>
      <if test="createTime != null" >
        #{createTime,jdbcType=TIMESTAMP},
      </if>
    </trim>
  </insert>

发现insertSelective对应的sql语句加入了NULL校验,只会插入数据不为null的字段值。insert则会插入所有字段,会插入null

INSERT INTO merchant_app(id,is_delete,create_time) VALUES( ?,?,? )

也就是说,此时即使数据表字段有default定义,遇到MyBatis的insert方法,也无能为力。

验证

不再使用insert方法,而使用insertSelective方法,同时,把数据表的TIMESTAMP类型改回为datetime类型:

alter table merchant_app modify create_time datetime default CURRENT_TIMESTAMP not null comment '创建日期';

可以插入当前时间now()数据。文章来源地址https://www.toymoban.com/news/detail-429768.html

参考

到了这里,关于SQLIntegrityConstraintViolationException: Column ‘create_time‘ cannot be null的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记录一次es7.8.1报错解决过程 unknown key [column] for create index

    记录一次es的\\\"不清楚\\\"报错 场景:本地安装es版本7.8.1,安装kibana7.8.1,首先启动es,接着启动kibana,创建一个索引,创建语句如下: 准备插入一条数据: 一直百度插入语句的问题,创建索引的问题,都没有找到真正的原因,这个时候看到es的后台打印日志如下: 报错如下:[C

    2024年02月11日
    浏览(47)
  • 【element UI 中的af-table-column组件】el-table-column如何自适应调整列宽,简单高效!!!

    在element UI框架中,组件el-table-column代表table的一列,有时候我们不想让里面的内容换行,网上的方法一般是需要给自适应列宽的column写一个动态的width,比较麻烦。 af-table-column是基于 element-ui 组件库的 el-table-column 组件, 支持自适应列宽功能 使用前得先导入,对于第二行“V

    2024年02月08日
    浏览(51)
  • HarmonyOS 开发基础(八)Row和Column

    一、Column 容器 1、容器说明: 纵向容器 主轴方向:从上到下纵向 交叉轴方向:从左到右横向 2、容器属性: justifyContent:设置子元素在主轴方向的对齐格式,参数 FlexAlign 枚举 alignItems:设置子元素在交叉轴方向的对齐格式,参数 HorizontalAlign 枚举 3、参数说明: space:内元素

    2024年01月22日
    浏览(44)
  • 鸿蒙Harmony-线性布局(Row/Column)详解

    人生的下半场,做个简单的人,少与人纠缠,多看大自然,在路上见世界,在途中寻自己。往后余生唯愿开心健康,至于其他,随缘就好!  目录 一,定义 二,基本概念 三,布局子元素在排列方向上的间距 四,布局子元素在交叉轴上的对齐方式 4.1 Column容器内子元素在水平

    2024年02月01日
    浏览(45)
  • el-table-column点击事件

    el-table-column 的点击事件是可以通过在 el-table-column 上使用 \\\"cell-click\\\" 或 \\\"header-click\\\" 事件来实现的。具体实现方法如下: 在 el-table-column 上绑定 \\\"cell-click\\\" 事件:

    2024年02月14日
    浏览(53)
  • (列置换密码)(Column Permutation Cipher)(含代码)

    密码学(在西欧语文中,源于希腊语kryptós“隐藏的”,和gráphein“书写”)是研究如何隐密地传递信息的学科。在现代特别指对信息以及其传输的数学性研究,常被认为是数学和计算机科学的分支,和信息论也密切相关。著名的密码学者Ron Rivest解释道:“密码学是关于如何

    2023年04月17日
    浏览(59)
  • LeetCode171. Excel Sheet Column Number

    Given a string columnTitle that represents the column title as appears in an Excel sheet, return its corresponding column number. For example: A - 1 B - 2 C - 3 … Z - 26 AA - 27 AB - 28 … Example 1: Input: columnTitle = “A” Output: 1 Example 2: Input: columnTitle = “AB” Output: 28 Example 3: Input: columnTitle = “ZY” Output: 701 Constraints:

    2024年02月19日
    浏览(41)
  • Harmony之学习Column&Row组件的使用

    一个丰富的页面需要很多组件组成,那么,我们如何才能让这些组件有条不紊地在页面上布局呢?这就需要借助容器组件来实现。 容器组件是一种比较特殊的组件,它可以包含其他的组件,而且按照一定的规律布局,帮助开发者生成精美的页面。容器组件除了放置基础组件外

    2024年02月01日
    浏览(58)
  • MySQL-- ADD COLUMN 添加多个字段的写法

    MySQL alter 同时添加多个字段写法 ALTER语法说明: ALTER TABLE 表名 ADD COLUMN 字段名 字段类型 默认值 注释 1 分开写多个 alter table 2 只写 ADD 不写COLUMN 多个字段名写到括号中,用逗号隔开 或者写多个ADD 3 写COLUMN 其实就是在2-1的基础上 加上COLUMN 相对规范 写多

    2024年02月06日
    浏览(39)
  • element el-table-column 循环

    当table中表头太多了,然后不想一个一个写,可以用循环的方式写 先上个图 直接上代码 data数据

    2024年02月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包