考察下面的 SQL 脚本:

CREATE TABLE test1(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
data VARCHAR(20),
ts1 TIMESTAMP NOT NULL,
createdAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

语义上来看,这里 ts1 列没有指定默认值,同时也没指定 ON UPDATE 的操作。

实际情况则不然,在 explicit_defaults_for_timestamp 关闭的情况下,t1 会被默认加上 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。这可通过 DESCRIBE test1 查看到。

mysql> describe test1;
+-----------+-------------+------+-----+-------------------+-----------------------------------------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+-------------------+-----------------------------------------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| data | varchar(20) | YES | | NULL | |
| ts1 | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
| createdAt | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
| updatedAt | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
+-----------+-------------+------+-----+-------------------+-----------------------------------------------+
5 rows in set (0.01 sec)

@@explicit_defaults_for_timestamp

explicit_defaults_for_timestamp 控制是否开启非标准模式下非法的日期值继续努力 NULL,零值等日期默认值被写入 TIMESTAMP 类型。

mysql> select @@explicit_defaults_for_timestamp;
+-----------------------------------+
| @@explicit_defaults_for_timestamp |
+-----------------------------------+
| 1 |
+-----------------------------------+
1 row in set (0.00 sec)

可以看到默认为开,现在来关闭它:

set @@explicit_defaults_for_timestamp=0;
关闭 `explicit_defaults_for_timestamp` 的执行结果
mysql> set @@explicit_defaults_for_timestamp=0;
Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> select @@explicit_defaults_for_timestamp;

+-----------------------------------+

| @@explicit_defaults_for_timestamp |

+-----------------------------------+

| 0 |

+-----------------------------------+

1 row in set (0.00 sec)

此时便可以正常执行文章开头的 SQL 语句创建一个未指定默认值的 TIMESTAMP 列。

根据官方文档中相关描述:

TIMESTAMP and DATETIME columns have no automatic properties unless they are specified explicitly, with this exception: If the explicit_defaults_for_timestamp system variable is disabled, the first TIMESTAMP column has both DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP if neither is specified explicitly.

--11.3.4 Automatic Initialization and Updating for TIMESTAMP and DATETIME

当且仅当表中第一个 TIMESTAMP 类型的列在没有指定默认值时,MySQL 会会其自动加上 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。这里 ON UPDATE CURRENT_TIMESTAMP 就需要小心了,如果你想保存的是一个确定性,它会在记录更新时自动更新这个日期,这就是我们表要的表现了。

所以对于 TIMESTAMP 类型,最好指定默认值,避免不可预知的表现。

相关资源

最新文章

  1. windows 程序设计自学:窗口正中显示Hello,World
  2. Android控件之CheckBox(复选框控件)
  3. stackview
  4. 【BZOJ 1927】 [Sdoi2010]星际竞速
  5. Research Papers
  6. 显示目录树命令tree
  7. Asp.net MVC 3 防止 Cross-Site Request Forgery (CSRF)原理及扩展 安全 注入
  8. 学习web之路
  9. mysql 创建数据 utf8
  10. python基础===随机打印txt文件中的某一行
  11. 斐波那契数列—Java
  12. Java课程设计——象棋(201521123042 姚佳希)
  13. 执行计划查看,autotrace工具的使用
  14. CCF系列之最优灌溉(201412-4)
  15. SSM-SpringMVC-29:SpringMVC中InitBinder的初步
  16. 在IIS上发布并运行ASP.NET Core
  17. django 1.11 目录
  18. DNS详解: A记录,子域名,CNAME别名,PTR,MX,TXT,SRV,TTL
  19. nohup和disown
  20. SVN windows内修改日志内容(错误解决)

热门文章

  1. 机器学习技法总结(六)Decision Tree Hypothesis
  2. 封装算法: 模板方法(Template Method)模式
  3. Struts拦截器(转)
  4. Nova镜像使用方法
  5. configuration默认设置
  6. 责任链模式-Chain of Responsibility
  7. mysql优化----大数据下的分页,延迟关联,索引与排序的关系,重复索引与冗余索引,索引碎片与维护
  8. CentOS7 安装和配置 mysql5.7
  9. close() was never explicitly called on database
  10. limit的用法