深入浅出timestamp

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

前提

对于timestamp相关的错误,之前也有耳闻,但是并没有详细去了解,导致昨天有位同事描述的错误场景不能及时回答,这说明自己对Mysql的理解还是知之甚少。故,这里详细谈谈timestamp

错误场景


好了,这里直奔主题吧。昨天有位同事遇到的错误ERROR 1293 (HY000):

* Mysql version 5.1.54

create table lc_test_0(
    `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'cms时间' ,
    `upload_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '上传时间'
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='已推送客户列表';

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

通过以上错误,查查手册就知道,timestamp类型不允许有两个CURRENT_TIMESTAMP作为default值。

既然如此,那我们就去掉一个呗

create table lc_test_3(
    `upload_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '上传时间',
    `update_time` timestamp NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='已推送客户列表';

Query OK, 0 rows affected (0.00 sec)

so easy,这不就解决了嘛。

可是问题真是这样嘛?有些同学比较严谨和认真,将两个字段的顺序对调一下,则

create table lc_test_2(
    `update_time` timestamp NOT NULL ,
    `upload_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '上传时间'
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='已推送客户列表';

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

你看看,问题又来了,这样彻底晕了,同样的建表语句,只是字段顺序变掉了,就错了?

莫非这是Mysql 的 BUG? 去Mysql Buglist中去查查看,结果没有类似bug。

目前能想到的就是仔细去看看官方文档对于CURRENT_TIMESTAMP的描述

* Mysql 5.1 *

One TIMESTAMP column in a table can have the current timestamp as the default value for initializing the column, as the auto-update value, or both. It is not possible to have the current timestamp be the default value for one column and the auto-update value for another column.

看的仔细的同学就会发现,current timestamp as the default value for initializing the column,意思就是Mysql 会初始化第一个TIMESTAMP字段的default值为‘current timestamp’。一个表里面多个TIMESTAMP column 只能拥有一个‘current timestamp’值。

so,这下豁然开朗,既然如此,那么就开始测试以上理论吧。

  • 既然第一个timestamp字段的默认default为‘current timestamp’,那我显示更改默认值总可以吧
create table lc_test_1(
    `update_time` timestamp NOT NULL default '0000-00-00',
    `upload_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '上传时间'
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='已推送客户列表';
Query OK, 0 rows affected  (0.10 sec)
  • 第一个timestamp字段的默认default为‘current timestamp’,第二个字段总不会了吧
root:test> create table lc_test_4(
      `update_time` timestamp NOT NULL ,
      `upload_time` timestamp NOT NULL
     )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='已推送客户列表';
Query OK, 0 rows affected (0.00 sec)

root:test> desc lc_test_4;
+-------------+-----------+------+-----+---------------------+-----------------------------+
| Field       | Type      | Null | Key | Default             | Extra                       |
+-------------+-----------+------+-----+---------------------+-----------------------------+
| update_time | timestamp | NO   |     | CURRENT_TIMESTAMP   | on update CURRENT_TIMESTAMP |
| upload_time | timestamp | NO   |     | 0000-00-00 00:00:00 |                             |
+-------------+-----------+------+-----+---------------------+-----------------------------+
2 rows in set (0.01 sec)

ok,到这里,我想这个问题应该彻底明白了吧。

那我们又回过头来思考一下,为什么只能拥有一个CURRENT_TIMESTAMP default值呢?说实话,我还真没想明白。但是,我知道Mysql 5.5 高版本和Mysql5.6 以及更高版本以及去掉了这个限制

Previously, at most one TIMESTAMP column per table could be automatically initialized or updated to the current date and time. This restriction has been lifted. Any TIMESTAMP column definition can have any combination of DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP clauses. In addition, these clauses now can be used with DATETIME column definitions. For more information, see Automatic Initialization and Updating for TIMESTAMP and DATETIME.

测试:

* Mysql 5.6 *

dbadmin:test> create table lc_test_1(
     `update_time` timestamp NOT NULL,
     `upload_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '上传时间'
     )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='已推送客户列表';
Query OK, 0 rows affected (0.01 sec)

dbadmin:test> create table lc_test_2(
        `upload_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '上传时间',
     `update_time` timestamp NOT NULL
    )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='已推送客户列表';
Query OK, 0 rows affected (0.02 sec)

结论


  • 以上问题,均源于对Mysql 官方文档的不细致学习造成。
  • Mysql官方文档目前虽然讲解的原理不是很深,很细,但是确实值得我们仔细阅读。
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8月前
|
存储 关系型数据库 MySQL
每天一道面试题之-mysql中datetime和timestamp的区别
每天一道面试题之-mysql中datetime和timestamp的区别
73 0
|
存储 缓存 NoSQL
分布式ID彻底把它搞懂
《分布式》系列
411 0
分布式ID彻底把它搞懂
Go面试题进阶知识点:select和channel
这篇文章将重点讲解Go面试进阶知识点:select和channel。
173 0
Go面试题进阶知识点:select和channel
|
前端开发 JavaScript
前端学习案例-new Date()参数
前端学习案例-new Date()参数
194 0
|
Python
Python编程:time和datetime时间模块详解
Python编程:time和datetime时间模块详解
156 0
Python编程:time和datetime时间模块详解
|
Unix Python
Python编程:time时间模块
Python编程:time时间模块
147 0
Python编程:time时间模块
|
SQL 缓存 监控
面试题:能谈谈Date、Datetime、Time、Timestamp、year的区别吗?
如果面试官问你:了解 date、datetime、time、timestamp、year 有什么区别吗? 其实大概率就是看你曾经用过哪些,以及有没有留心对比它们的异同。如果你没有时间去做一下小实验,没关系!大概浏览一下我下面的小Case就OK了。
135 0
|
存储 算法 NoSQL
No.1-时序数据库随笔 - Time Series DBMS 综述
这是一篇无法一口气读完的、文字过万[正文字数14390]的长文,这是一个无法中途不上厕所就看完的、关于时序数据库的视频[时长111分钟]分享的文字整理..
2220 0
No.1-时序数据库随笔 - Time Series DBMS 综述
|
存储 算法 NoSQL
No.1 - Apache IoTDB 随笔 - Time Series DBMS 综述(文末彩蛋)
“这是一篇无法一口气读完的、文字过万[正文字数14390]的长文,这是一个无法中途不上厕所就看完的、关于时序数据库的视频[时长111分钟]分享...” [观看视频](https://mp.weixin.qq.com/s/YgnSSahp70iV_X12aYEtPg) 大家好,很开心能够和大家一起交流时序数据库的相关的内容:) **【文末有彩蛋】** ![image.png](https
1384 0
No.1 - Apache IoTDB 随笔 - Time Series DBMS 综述(文末彩蛋)
|
算法
算法学习之路|A+B Format
Calculate a + b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits).
1044 0