Mysql系统参数explicit_defaults_for_timestamp详解及建议

题外话

在日常工作中,时间戳是非常重要的一个属性,整理以前笔记的时候看到一关于参数explicit_defaults_for_timestamp相关的坑,本文分享相关内容。

一、explicit_defaults_for_timestamp作用

此参数在5.6.6之后有改动,本次测试为mysql 5.7版本

mysql 中有这样的一个默认行为,如果一行数据中某些列被更新了,如果这一行中有timestamp类型的列,那么么这个timestamp列的数据也会被自动更新到 更新操作所发生的那个时间点;这个操作是由explicit_defaults_for_timestamp这个变更控制的

二、explicit_defaults_for_timestamp取不同值的区别

当explicit_defaults_for_timestamp=OFF时

1)如果TIMESTAMP列没有显示的指明null属性,那么该列会被自动加上not null属性,如果往这个列中插入null值,会自动的设置该列的值为current timestamp值。

2)表中的第一个TIMESTAMP列,如果没有指定null属性或者没有指定默认值,也没有指定ON UPDATE语句。那么该列会自动被加上DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性。

3)如果表中有多个TIMESTAMP列,第一个TIMESTAMP列之后的其他的TIMESTAMP类型的列,如果没有指定null属性,也没有指定默认值,那么该列会被自动加上DEFAULT ‘0000-00-0000:00:00’属性。如果insert语句中没有为该列指定值,那么该列中插入’0000-00-00 00:00:00’,并且没有warning。

在这里插入图片描述

当explicit_defaults_for_timestamp=ON

1)此时如果TIMESTAMP列没有显示的指定not null属性,那么默认的该列可以为null,此时向该列中插入null值时,会直接记录null,而不是current timestamp。

在这里插入图片描述

2)不会自动的为表中的第一个TIMESTAMP列加上DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性,除非你在建表的时候显示的指明NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。但这时如果插入值为NULL就会直接报错。

在这里插入图片描述

三、总结建议

explicit_defaults_for_timestamp 变量会直接影响表结构,也就是explicit_defaults_for_timestamp的作用时间

建议:

一、	可以在创建表的时候规范要求,写完完整的语法,因为在explicit_defaults_for_timestamp值有变化时,创建出的表定义timestamp字段是完全不同的。

二、	可以根据业务系统不同的需求设置explicit_defaults_for_timestamp参数值,如果业务系统有表的timestamp列是一定要插入NULL值并且要用作时间戳更新,那么explicit_defaults_for_timestamp参数值只能为OFF,如果业务系统有表的timestamp就是需要插入NULL值,那么explicit_defaults_for_timestamp参数值就要设置为ON,但这种情况应该非常少。

哎哟,不错噢! - - - - - - 欢迎指出有误的地方以及补充更好的方法

猜你喜欢

转载自blog.csdn.net/Tah_001/article/details/108055677