zoukankan      html  css  js  c++  java
  • 设置TIMESTAMP和DATETIME的自动初始化及自动更新

    最近有一个关于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 behaviorsMySQL5.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以后的事了。
     
  • 相关阅读:
    关于电商开发中金额的数据存储
    java编程IO简单回顾和学习
    不同数据源之间的数据同步jdbc解决方案
    简单的dialog,类似alert弹框
    PageInfo 前台分页js,带分页栏
    oracle 操作,偶尔记一下
    时间控件My97简单用法
    时间控件格式化,有了他,我再也不怕格式化时间了
    oracle 数据库io 异常,错误代码17002 解决办法
    列表渲染
  • 原文地址:https://www.cnblogs.com/leohahah/p/9176713.html
Copyright © 2011-2022 走看看