关于在SQL语句中记录添加时间和修改时间的简单用法:invalid default value for create_time

最近看到别人的项目中,数据库中加入了创建时间和修改时间,感觉这个挺实用,就想创建一个demo试试怎么用,查询之后发现修改时间使用的是timestamp字段格式,数据库会根据当前时间,自动处理,不需要在SQL语句中设置,创建时间为datetime,默认值是CURRENT_TIMESTAMP,使用时直接在SQL语句中使用now()来获取当前的时间,但是动手之后,问题就来了!!!!

首先是在创建数据库字段的时候就报错了,使用的是MySQL,工具用的Navicat,但是,设置create_time字段为datetime,默认值为CURRENT_TIMESTAMP保存时就提示invalid default value for create_time的错误,反复查询之后,无果。。。。。。。。。。。
我按照别人的博客里面的截图直接在Navicat里面手动设置相同的字段和默认类型,还是报这个错误。。。。。。。wtf??????

这是别人设置的:
这里写图片描述

这是我的设置:
这里写图片描述
这里写图片描述
保存就提示:
这里写图片描述
折腾了半天,查到说是MySQL 5.6以后timestamp设定默认值规则改变,不能为”0000 00-00 00:00:00”,但是现在我并没有插入值,只是创建数据库字段,这里就通过不了了 还谈什么后期插入新的数据呢。。。。。。。。

在查了将近一个小时的时间里 很多博客都说修改一下数据库默认设置的时间不能为零,我感觉这个根本无关痛痒,我也没有尝试。。。。。。

最后偶然在一个博客下面看到一句总结:

timestamp类型适合用来记录数据的最后修改时间,因为只要你更改了记录中其他字段的值,timestamp字段的值都会被自动更新。(如果需要可以设置timestamp不自动更新)

然后想出来一个笨方法:

设置的字段如下图所示:

这里写图片描述
因为创建时间是固定的,修改的时间是跟随系统更新的,所以将create_time字段类型设置为varchar,创建新数据时,为这个字段赋值,直接使用now(),取值,插入到create_time 里面即可。将update_time 设置为timestamp,并勾选根据当前时间戳更新,
既然now(),可以获取到当前时间,那么可以尝试将create_time 类型设置为字符串,然后 在执行insert语句的时候,在添加的SQL语句中的字段里面加上create_time,value为now(), 这样就可以在数据库中插入添加的时间了

比如现在往数据库添加一条新的数据:insert into user ( username, password, create_time ) VALUES ('小明22', '12345', now())
这里写图片描述

这里create_time和update_time都是当前时间,但是不同的是 create_time的时间是使用now()获取到的当前系统时间,然后使用SQL语句,赋值给create_time的,而update_time 是系统自动赋值的,不需要在SQL语句中具体操作的。

执行修改的操作后,update_time 会自动更新为修改的时间

执行语句update user set username = '小明32' where id = 32之后,create_time 仍然为创建时的时间,而update_time自动更新为新的时间
这里写图片描述

**总结:**由于创建的时间是固定的,可以设置create_time字段的属性为varchar,在创建时,在SQL语句中使用now(),来为create_time字段赋值。
updae_time的属性设置为timestamp,并勾选根据时间戳更新,这样在执行update语句时,会自动更新修改的时间。


两年过去了。。。。。。。。。。


两年之后,再次看这篇文章,发现存在些瑕疵,create_time使用字符串存储明显不太合适,字符串占用的字节,这里补充一下:

借用菜鸟教程里面的图:
在这里插入图片描述
关于创建时间和更新时间,这个一般数据库表格里面都会有这两个字段的,目的是为了标识数据的时间,方便后面根据时间排序或者根据时间段进行查询。

但是字段的类型设置可以因人而异,目前我们公司项目中创建时间和更新时间都是使用的是timestamp,对应的Java类型为TimeStamp,赋值时直接使用user.setCreateTime(new Timestamp(System.currentTimeMillis()));,更新时间也可以按照上面的,设置成MySQL自动更新,也可以更新时手动赋值。

但是涉及到时间的字段,不能盲目的全部设置成timestamp,最好是根据需求,此字段是否需要显示时分秒,如果只需要记录日期,则设置成date是最好的,实体类字段映射成LocalDate,这样在业务中处理时可直接使用java8的时间操作,还是很方便的。

其中timestamp和datatime的区别:

timestamp是有时间区间的,有最大值,如果私有业务的时间字段使用了timestamp时,并且有续期业务,就要注意,到2038年的时候,插入数据就会可能报异常。

datatime是时区无关的,存入的时间原来是多少就是多少,而timestamp是可以转换时区的。

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值