简介:
explicit_defaults_for_timestamp 系统变量决定MySQL服务端对timestamp列中的默认值和NULL值的不同处理方法。

此变量自MySQL 5.6.6 版本引入,分为全局级别和会话级别,可动态更新,默认值为OFF。本文主要介绍该参数打开和关闭情况下对timestamp的影响 。

1.explicit_defaults_for_timestamp = OFF

当该参数默认设置为OFF时,其行为如下:

在默认情况下,如果timestamp列没有显式的指明null属性,那么该列会被自动加上not null属性(而其他类型的列如果没有被显式的指定not null,那么是允许null值的),如果往这个列中插入null值,会自动的设置该列的值为current timestamp值。

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

对于其它TIMESTAMP列,如果没有显示指定NULL和DEFAULT属性的话,会自动设置为NOT NULL DEFAULT ‘0000-00-00 00:00:00’。

(当然,这个与SQL_MODE有关,如果SQL_MODE中包含’NO_ZERO_DATE’,实际上是不允许将其默认值设置为’0000-00-00 00:00:00’的。)

下面我们来测试下:(本文操作基于MySQL5.7.23 版本 SQL_MODE不包含’NO_ZERO_DATE’)

show variables like 'explicit_defaults_for_timestamp';

create table test (
col1 timestamp,
col2 timestamp,
col3 timestamp default '2010-01-01 00:00:00'
);

我们查看创建的表:

show create table test;

insert into test values (null,null,null);

MySQL自动为第一个timestamp字段自动设置NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP属性;

而后面的timestamp字段,虽然设置了 **NOT NULL DEFAULT ‘0000-00-00 00:00:00’**属性,如果向timestamp这个列中插入null值,系统会自动的设置该列的值为current timestamp值。

综上所述:

当explicit_defaults_for_timestamp=OFF时,即使timestamp列设为NOT NULL也能插入NULL值,系统会自动将NULL值设为current timestamp。

2.explicit_defaults_for_timestamp = ON

my.ini配置文件中,添加了该项配置,否则启动时,会提示以下报警:

[Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
Please use --explicit_defaults_for_timestamp server option (see
documentation for more details).

但是我在华为的实例中root权限:

当该参数设置为ON时,其行为如下:

  1. 如果timestamp列没有显式的指定not null属性,那么默认的该列可以为null,此时向该列中插入null值时,会直接记录null,而不是current timestamp。
  2. 不会自动的为表中的第一个timestamp列加上DEFAULT CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP属性。
  3. 如果timestamp列被加上了not null属性,并且没有指定默认值。这时如果向表中插入记录,但是没有给该TIMESTAMP列指定值的时候,如果strict sql_mode被指定了,那么会直接报错。
  4. 如果strict sql_mode没有被指定,那么会向该列中插入’0000-00-00 00:00:00’并且产生一个warning。

同样的,我们来测试一下,为了测试我把我的本地计算的mysql5.5卸载重新安装5.7,一段操作猛如虎:

mysql> show variables like 'explicit_defaults_for_timestamp';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | OFF |
+---------------------------------+-------+
1 row in set, 1 warning (0.00 sec) mysql> set explicit_defaults_for_timestamp=1;
Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'explicit_defaults_for_timestamp';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | ON |
+---------------------------------+-------+
1 row in set, 1 warning (0.00 sec) mysql> use test;
Database changed mysql> create table test (
-> col1 timestamp,
-> col2 timestamp,
-> col3 timestamp default '2010-01-01 00:00:00'
-> );
Query OK, 0 rows affected (0.02 sec) mysql> insert into test values (null,null,null);
Query OK, 1 row affected (0.01 sec) mysql> select * from test;
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
| NULL | NULL | NULL |
+------+------+------+
1 row in set (0.00 sec)

最新文章

  1. 在真机调试 iOS 应用:理解 Certificates, Identifiers & Profiles
  2. 2017年第1贴:EXT.JS使用MVC模式时,注意如何协调MODEL, STORE,VIEW,CONTROLLER的关系
  3. .NET Core的“dotnet restore”、“dotnet build”和“dotnet run”命令都是用来干什么的?
  4. Xhprof安装笔记(PHP性能监控)
  5. Centos环境下删除Oracle11g客户端文档
  6. MFC新婚之夜(笑昏,大概是指MFC的人固步自封)
  7. Cocos Studio和Cocos2d-x版本对应关系
  8. 正则化方法:L1和L2 regularization、数据集扩增、dropout(转)
  9. Vue第一个自定义组件:数字输入框(number-input)
  10. Linux增加LV(逻辑卷)容量
  11. 【Python系列】HDF5文件介绍
  12. ORACLE数据库学习之备份与恢复
  13. Lua的线程和状态
  14. Hadoop生态系统之Yarn
  15. Scrum Meeting 5
  16. 【mysql】创建索引
  17. Android Studio 增加函数注释模板
  18. 什么是POP3、SMTP和IMAP?
  19. python 元组切片
  20. linux tmux命令小结

热门文章

  1. Machine Learning Glossary
  2. mysql查看索引的大小
  3. Python 实现微信小程序的用户登录
  4. 6.66 分钟,一文Python爬虫解疑大全教入门!
  5. ansible使用普通用户免密登陆+sudo提权
  6. Linux中光标消失解决办法
  7. dfs的剪枝优化
  8. VBA错误处理(十八)
  9. 如何在SAP云平台ABAP编程环境里把CDS view暴露成OData服务
  10. 流程控制 if----else