timestamp的自动更新 ON UPDATE CURRENT_TIMESTAMP

最近有一个关于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参数:

关于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以后的事了。

原文地址:https://www.cnblogs.com/FengZeng666/p/12011221.html

时间: 2024-10-11 03:36:40

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

MySQL的timestamp类型自动更新问题

今天建了一个表,里面有一个列是timestamp类型,我本意是在数据更新时,这个字段的时间能自动更新.岂知对这个类型的值还不甚了解,导致出错.发现这个字段只是在这行数据建立的时候有值,在更新的却无变化. 查找资料,发现是我建表的语句有问题: 以下是代码片段: CREATE TABLE `test` ( `t1` timestamp NOT NULL default CURRENT_TIMESTAMP, `ww` varchar(5) NOT NULL ) ENGINE=InnoDB DEFAUL

MySQL的timestamp类型自动更新问题【转】

今天建了一个表,里面有一个列是timestamp类型,我本意是在数据更新时,这个字段的时间能自动更新.岂知对这个类型的值还不甚了解,导致出错.发现这个字段只是在这行数据建立的时候有值,在更新的却无变化. 查找资料,发现是我建表的语句有问题: 以下是代码片段: CREATE TABLE `test` (  `t1` timestamp NOT NULL default CURRENT_TIMESTAMP,  `ww` varchar(5) NOT NULL) ENGINE=MyISAM ; 而实际

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

IntelliJ IDEA默认文件是自动保存的,但是手头有个项目jsp文件改动后,在tomcat中不能立即响应变化.想要jsp文件改动后立刻看到变化,可以通过修改配置来实现. 在IDEA tomcat 中server的配置里,有个On frame deactivation,选择Update classes and resources.另外有个配置on update action,就是手动操作的时候采取什么动作,可以重启服务器,也可以像上面一样更新类和资源文件,我选的是Update classes

设置createTime和updateTime能自动更新

-- alter TABLE tblInstrumentShortTarget modify createTime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP-- alter table tblInstrumentShortTarget MODIFY updateTime timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP; 原文地址:https://www.cnblogs.com/eret

mysql(自动添加系统时间)timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性

timestamp有两个属性,分别是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP两种,使用情况分别如下: 1.CURRENT_TIMESTAMP 当要向数据库执行insert操作时,如果有个timestamp字段属性设为 CURRENT_TIMESTAMP,则无论这个字段有木有set值都插入当前系统时间 2.ON UPDATE CURRENT_TIMESTAMP 当执行update操作是,并且字段有ON UPDATE CURRENT_TIMESTA

mysql中timestamp的自动生成与更新

转自:mysql中timestamp的自动生成与更新 MYSQL中TIMESTAMP类型可以设定默认值,就像其他类型一样.1.自动UPDATE 和INSERT 到当前的时间:表:---------------------------------Table Create Table ------ -------------------------- CREATE TABLE `t1` ( `p_c` int(11) NOT NULL, `p_time` timestamp NOT NULL DEF

timestamp ---自动更新修改时间 与 记录首次插入时间

自动更新修改时间: mysql> create table z(a int ,b timestamp on update current_timestamp); mysql> insert into z select 1,current_timestamp; mysql> select * from z; +------+---------------------+ | a | b | +------+---------------------+ | 1 | 2016-06-26 07:

mysql 5.5与5.6 timestamp 字段 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP的区别

http://www.111cn.net/database/mysql/55392.htm 本文章来给各位同学介绍关于mysql 5.5与5.6 timestamp 字段 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP的区别,希望此教程对各位有帮助. mysql5.6数据库:  代码如下 复制代码 [BIGHD]([email protected]) [cm]> SELECT version(); +------------+ | ve

mysql中timestamp自动更新和初始化

1.概述 在我们设计表的时候,考虑将行数据的创建时间和最后更新时间记录下来是很好的实践.尤其是可能需要做数据同步或者对数据新鲜度有要求的表.举些应用场景,更新距上次更新超过2小时的行数据,或者是将一个月前的订单数据归档等等.我们想把这个的需求丢给数据库服务器管理,而不是在应用程序中对每一条语句设置创建时间和最后更新时间字段.在mysql中,这实现起来很容易.我们需要借助于DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 2.简单示例