先看官方的描述:https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
这个参数全局或者sessioin都可以设置,默认是不开启的,可以这样理解:如果一行数据中某些列被更新了,如果这一行中有timestamp类型的列,那么么这个timestamp列的数据也会被自动更新到 更新操作所发生的那个时间点;这个操作是由explicit_defaults_for_timestamp这个变更控制的,大概有有以下几种情况:
1、当explicit_defaults_for_timestamp为OFF不打开的时候:
a)如果TIMESTAMP列没有显示的指明null属性,那么该列会被自动加上not null属性,如果往这个列中插入null值,会自动的设置该列的值为current timestamp值。
b)表中的第一个TIMESTAMP列,如果没有指定null属性或者没有指定默认值,也没有指定ON UPDATE属性。那么该列会自动被加上DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性。
c)如果表中有多个TIMESTAMP列,第一个TIMESTAMP列之后的其他的TIMESTAMP类型的列,如果没有指定null属性,也没有指定默认值,那么该列会被自动加上DEFAULT ‘0000-00-0000:00:00’属性。如果insert语句中没有为该列指定值,那么该列中插入’0000-00-00 00:00:00’,并且没有warning。
2、当explicit_defaults_for_timestamp为ON打开的时候:
a)此时如果TIMESTAMP列没有显示的指定not null属性,那么默认的该列可以为null,此时向该列中插入null值时,会直接记录null,而不是current timestamp。
b)不会自动的为表中的第一个TIMESTAMP列加上DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性,除非你在建表的时候显示的指明NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。但这时如果插入值为NULL就会直接报错。
c)timestamp字段有not null属性,而且不允许为空值;在strict的sql模式下,如果你insert语句里面有默认值为null值会报错;使用'0000-00-00 00:00:00'的默认值,会自动用这个默认值。
d)timestamp字段带有not null属性,而且没有默认值,inset式不指定该字段的值,strict sql_mode下,会报错。非strict sql_mode下有默认值'0000-00-00 00:00:00'的话会录入默认值,这有点想datetime字段。
3、版本的差异
这个参数explicit_defaults_for_timestamp在MySQL 5.6.6开始加入,并且MySQL 5.6跟MySQL 5.7的默认SQL模式不同,MySQL 5.7的SQL模式更加严格了,限制了不合法的日期输入,比如”0000-00-00 00:00:00″。