最近有一个关于MySQL版本升级的事,涉及到一些关于时间类型的细节问题需要查明,因此到官网找到相关文章,翻出来比较方便自己理解,博客这里也贴一下。

参考官网网址:

https://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html

自MySQL 5.6.5开始TIMESTAMP和DATETIME类型可以实现自动初始化或更新为CURRENT_TIMESTAMP的功能,在5.6.5之前这个特性只有TIMESTAMP才能用。鉴于现在时间类型基本都用DATETIME(因为TIMESTAMP的范围很小局限性也很大),因此5.6.5之后DATETIME也实现了这个功能。
这个功能详细描述下就是:
  • DATETIME也可以像TIMESTAMP一样将CURRENT_TIMESTAMP设为默认值
  • 如果你为此时间列设置了自动更新的属性,那么只要一条记录的其他任何列值发生改变,时间列都会自动更新为CURRENT_TIMESTAMP。
假如你不想让设置自动更新属性的时间列随其他列值的改变而改变,你可以为他显式的赋一个值。
TIMESTAMP类型的表现:
  • 默认的,在8.0.2版本之前,如果你未显式的将timestamp设置为NULL,那么timestamp列会被自动设置为not null,给这种字段显式赋NULL值会自动存为current_timestamp 。
  • 默认的,在8.0.2版本之前,对于表中的第一个timestamp列,如果你未显式的指定可以为NULL,且未指定默认值,且未指定on update属性,那么这个列会被自动设置为:NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。
  • 默认的,在8.0.2版本之前,对于表中的非第一个timestamp列,如果你未显式的指定可以为NULL,且未指定默认值,那么默认值会自动设置为'0000-00-00 00:00:00'。
以上现象官网称之为:nonstandard behaviors
在5.6.6之前,这可以算是他相比datetime的一个优势,也有人把它视为一个BUG认为他很麻烦,但无论如何在5.6.6之前如果你有将CURRENT_TIMESTAMP设为默认值的需求,那你只能选择timestamp类型。不过好在5.6.6之后datetime也支持设置CURRENT_TIMESTAMP默认值啦。
为了避免上述timestamp的nonstandard behaviors,MySQL5.6.6引入了explicit_defaults_for_timestamp参数:
此参数在8.0.1之前的版本默认是OFF,只读参数,而在MySQL8.0.2之后此参数默认值变为ON而且可以在线修改。
将explicit_defaults_for_timestamp设为ON之后,timestamp的表现如下:
  • 向timestamp插入NULL值不会自动存为current_timestamp啦,如果想要存current_timestamp,那么直接赋值为current_timestamp或者其同义词,例如now().
  • timestamp列如果不显式的指定为not null,那么默认就是NULL,想这个列插入NULL值存的就是NULL,而不是current_timestamp。
  • 指定not null的timestamp列不再允许插入NULL值,如果你强行为此列插入NULL值,那么要么返回一个错误,要么插入'0000-00-00 00:00:00'(与SQL mode有关)。
  • 对于设置了not null且未设置default值的timestamp列,向这种表插入数据时如果未指定timestamp列的值,那么插入结果取决于sql_mode,如果是strict SQL mode那么直接报错,否则插入'0000-00-00 00:00:00'并报一个warning。
  • timestamp列不再会被自动设为DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,你必须手动设置。
  • 表中的首个timestamp列也不再和其他timestamp列有差别。

因此可以看到explicit_defaults_for_timestamp参数的作用其实就是让你可以自定义timestamp的默认值和NULLABLE属性,mysql不再会自作主张的给你自动设置。

另外此参数在8.0.11中提示已经要逐步弃用(转为内部默认配置)。
最后:虽然5.6.6之后可以通过设置explicit_defaults_for_timestamp来改变timestamp的设置模式,但还是推荐用datetime,explicit_defaults_for_timestamp默认为on已经是8.0以后的事了。

timestamp的自动更新 ON UPDATE CURRENT_TIMESTAMP的更多相关文章

  1. tk.mybatis通用插件updateByPrimaryKeySelective无法自动更新ON UPDATE CURRENT_TIMESTAMP列的解决办法

    tk.mybatis是一个很好用的通用插件,把CRUD这些基本的数据操作全都用动态SQL语句自动生成了,mapper和xml里十分清爽,但是昨天发现有一个小坑,记录在此: 有一张表,结构如下(已经简化 ...

  2. mysql 添加[取消]timestamp的自动更新

    创建自动更新的 timestamp (插入或修改时 uptime都会自动更新) CREATE TABLE `hello` (`id` int(11) NOT NULL,`uptime` timesta ...

  3. mysql 修改[取消]timestamp的自动更新

    创建自动更新的 timestamp (插入或修改时 uptime都会自动更新) CREATE TABLE `hello` ( `id` int(11) NOT NULL, `uptime` times ...

  4. MySQL的timestamp类型自动更新问题

    今天建了一个表,里面有一个列是timestamp类型,我本意是在数据更新时,这个字段的时间能自动更新.岂知对这个类型的值还不甚了解,导致出错.发现这个字段只是在这行数据建立的时候有值,在更新的却无变化 ...

  5. Intellij IDEA热加载更新 IntelliJ IDEA热加载自动更新(Update classes and resources )

    定义及分类 1.1 定义 在web开发环境下,所谓热部署,即在不重新部署webapp的情况下,实时将工程代码改动更新到web容器中(例如tomcat).其原理可以类比ajax的作用,即局部刷新工程资源 ...

  6. IntelliJ IDEA热加载自动更新(Update classes and resources )

          IntelliJ IDEA默认文件是自动保存的,但是手头有个项目jsp文件改动后,在tomcat中不能立即响应变化.想要jsp文件改动后立刻看到变化,可以通过修改配置来实现.       ...

  7. timestamp的两个属性:CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP

    timestamp有两个属性,分别是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP两种,使用情况分别如下: 1. CURRENT_TIMESTAMP 当要 ...

  8. 最清晰易懂的Mysql CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP区别

    timestamp数据类型 Mysql数据库中,当字段类型为timestamp(时间戳)时,如果默认值取CURRENT_TIMESTAMP,则在insert一条记录时,此时的值自动设置为系统当前时间, ...

  9. MySQL 使用 ON UPDATE CURRENT_TIMESTAMP 自动更新 timestamp (转)

    原文地址: https://blog.csdn.net/heatdeath/article/details/79833492 `create_time` timestamp not null defa ...

随机推荐

  1. 日文NLP分词系统

    mecab(http://mecab.sourceforge.net/)是奈良先端科技大学开发的日文分词系统,基于CRF的分词原理,有c++实现,提供python.perl.ruby等接口 日文NLP ...

  2. Dockfile中的命令如何在.sh中执行

    有类似如下内容的Dokefile文件.1 RUN cd /tmp/patch \ && /lib/python3./site-packages/moduleA/a.* \ && ...

  3. Codeforces Round #563 (Div. 2) E. Ehab and the Expected GCD Problem

    https://codeforces.com/contest/1174/problem/E dp 好题 *(if 满足条件) 满足条件 *1 不满足条件 *0 ///这代码虽然写着方便,但是常数有点大 ...

  4. Ruby 环境

    Ruby 环境 本地环境设置 如果您想要设置 Ruby 编程语言的环境,请阅读本章节的内容.本章将向您讲解与环境设置有关的所有重要的主题.建议先学习下面几个主题,然后再进一步深入学习其他主题: Lin ...

  5. 【Tomcat】Tomcat调优

    Tomcat的默认配置,性能并不是最优的,我们可以通过优化tomcat以此来提高网站的并发能力.提高Tomcat的性能可以分为两个方向. 服务器资源 服务器所能提供CPU.内存.硬盘的性能对处理能力有 ...

  6. NX二次开发-UFUN设置除工作层之外的所有图层的状态UF_LAYER_set_all_but_work

    NX11+VS2013 #include <uf.h> #include <uf_ui.h> #include <uf_layer.h> UF_initialize ...

  7. CSDN首页> 云计算 孙玄:解析58同城典型技术架构及演变

    转:http://www.csdn.net/article/2015-04-09/2824437 在UPYUN主办的“UPYUN Open Talk”第三期北京站上,58同城系统架构师孙玄详细介绍了5 ...

  8. fastText一个库用于词表示的高效学习和句子分类

    fastText fastText 是 Facebook 开发的一个用于高效学习单词呈现以及语句分类的开源库. 要求 fastText 使用 C++11 特性,因此需要一个对 C++11 支持良好的编 ...

  9. 事件绑定addEventListener

    通过addEventListener监听函数实现的dom事件绑定 addEventListener可以为当前dom添加一个事件(这个事件可以是个已有的事件),这就无法避免我们在写代码的时候重复去绑定同 ...

  10. C盘清理垃圾

    经常清理C盘垃圾,会让系统运行更快,避免死机,今天教大家一种简单实用的方法,用文本文档清理垃圾: 1:在电脑桌面空白处右键-建立文本文档: 2:把以下代码复制到文本里 @echo offecho 正在 ...