[mysql] timestamp自动更新和初始化
1.概述
在我们设计表的时候,考虑将行数据的创建时间和最后更新时间记录下来是很好的实践。尤其是可能需要做数据同步或者对数据新鲜度有要求的表。举些应用场景,更新距上次更新超过2小时的行数据,或者是将一个月前的订单数据归档等等。我们想把这个的需求丢给数据库服务器管理,而不是在应用程序中对每一条语句设置创建时间和最后更新时间字段。在mysql中,这实现起来很容易。我们需要借助于DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP
2.简单示例
--创建测试表
CREATE TABLE `timestampTest` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 --检测默认值,插入测试数据
INSERT INTO timestampTest (name) VALUES ('aa'),('bb'),('cc'); --检测自动更新,更新某条数据
UPDATE timestampTest SET name = 'ab' WHERE id = 1;

例子非常简单,结果也很明显,我就不加赘述了。
3.思考
执行update语句,并未改变列值(或者说设置值为当前值),on update current_timestamp列是否会更新?
不会,大家可以看一下执行完update后出现的提示——Rows matched: 1 Changed: 0 Warnings: 0。官方文档的解释是
An auto-updated column remains unchanged if all other columns are set to their current values. To prevent an auto-updated column from updating when other columns change, explicitly set it to its current value. To update an auto-updated column even when other columns do not change, explicitly set it to the value it should have

CURRENT_TIMESTAMP,CURRENT_TIMESTAMP(),LOCALTIME,LOCALTIME(),LOCALTIMESTAMP,LOCALTIMESTAMP(),NOW()的关系?
这七个是同义词关系
- Timestamp类型的默认值
我们讨论默认情况(严格模式)下mysql对timestamp类型的处理:
- mysql不会给timestamp设置默认值,除非显式设置default约束或者可空null。特例:mysql会给表第一个timestamp类型的字段同时添加default current_timestamp和on update timestamp
- 禁止mysql的特例处理有两个办法
- 设置
explicit_defaults_for_timestamp为enable - 显式设置该字段default或者null
- timestamp列默认not null。没有显式指定nullable,那么default null不合法
- 其他情况均会引起不合法报错
举一些例子,帮助理解
#语句不合法,出现了两个未显示设置default或null的timestamp
CREATE TABLE `tt1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20),
`t1` timestamp ,
`t2` timestamp ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 #语句合法,t1字段 not null default current_timestamp on update current_timestamp,t2可空
CREATE TABLE `tt2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20),
`t1` timestamp ,
`t2` timestamp null,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 #语句不合法 t2字段没有设置default或null,也非表的第一个timestamp字段
CREATE TABLE `tt3` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20),
`t1` timestamp null,
`t2` timestamp ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 #语句不合法,这个看起来貌似合法,套用我们的规则,可以发现t2字段没有显示指定null/default,尽管指定了not null也不行
CREATE TABLE `tt4` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20),
`t1` timestamp null,
`t2` timestamp not null,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 #语句不合法 t1,t2均合法,问题出在t3上,timestamp 默认not null,在没有显式指定null的时候,default null是不合法的
CREATE TABLE `tt5` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20),
`t1` timestamp not null,
`t2` timestamp null,
`t3` timestamp DEFAULT null,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
小技巧:可以使用show create table `tablename` 来查看mysql处理后的表定义,下面是tt2这张表的定义,验证了我们的结论


- Timestamp和datetime的异同
| timestamp | datetime | |
| 同 | 可自动更新和初始化,默认显示格式相同YYYY-MM-dd HH:mm:ss | |
| 异 |
自动时区转化,实际存储毫秒数,4字节存储 |
不支持时区,8字节存储 |
4.参考
1.Automatic Initialization and Updating for TIMESTAMP and DATETIME
[mysql] timestamp自动更新和初始化的更多相关文章
- timestamp ---自动更新修改时间 与 记录首次插入时间
自动更新修改时间: mysql> create table z(a int ,b timestamp on update current_timestamp); mysql> insert ...
- mysql 时间自动更新问题
万恶的根据当前时间戳更新,有时候会自动更新,有时候又不会. 通过navicat 创建datetime类型的字段时,会自动勾选上根据当前时间戳更新.当更新数据的时候勾上这个的字段时间就会更改为当前的时间 ...
- mysql中自动更新时间CURRENT_TIMESTAMP
timestamp的两个属性:CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP http://blog.163.com/qiongling007@126/b ...
- mysql 添加[取消]timestamp的自动更新
创建自动更新的 timestamp (插入或修改时 uptime都会自动更新) CREATE TABLE `hello` (`id` int(11) NOT NULL,`uptime` timesta ...
- mysql 修改[取消]timestamp的自动更新
创建自动更新的 timestamp (插入或修改时 uptime都会自动更新) CREATE TABLE `hello` ( `id` int(11) NOT NULL, `uptime` times ...
- 设置TIMESTAMP和DATETIME的自动初始化及自动更新
最近有一个关于MySQL版本升级的事,涉及到一些关于时间类型的细节问题需要查明,因此到官网找到相关文章,翻出来比较方便自己理解,博客这里也贴一下. 参考官网网址: https://dev.mysql. ...
- MySQL的timestamp类型自动更新问题
今天建了一个表,里面有一个列是timestamp类型,我本意是在数据更新时,这个字段的时间能自动更新.岂知对这个类型的值还不甚了解,导致出错.发现这个字段只是在这行数据建立的时候有值,在更新的却无变化 ...
- timestamp的自动更新 ON UPDATE CURRENT_TIMESTAMP
最近有一个关于MySQL版本升级的事,涉及到一些关于时间类型的细节问题需要查明,因此到官网找到相关文章,翻出来比较方便自己理解,博客这里也贴一下. 参考官网网址: https://dev.mysql. ...
- MySQL load数据的时候自动更新时间
MySQL load数据的时候自动更新时间 前提 CREATE TABLE table_name ( dt varchar(255) NULL , ctime timestamp NULL ON UP ...
随机推荐
- [转]Entity Framework vs. LINQ to SQL
Entity Framework和LINQ to SQL到底有什么区别?这是一个很常见的问题.下面的表中简要罗列了两种技术的主要区别. LINQ to SQL Entity Framework 复杂度 ...
- C# WinForm程序打印条码 Code39码1
做WinForm程序需要打印条码,为了偷懒不想自己写生成条码的程序在网上下载一个标准的39码的字体,在程序里面换上这个条码字体即可打印条码了. 最重要的一点作为记录: 如果想把“123456789”转 ...
- 基于nodejs实现js后端化处理
今天D哥给我提了个问题,"用php执行过js没"?咋一听,没戏~~毕竟常规情况下,js是依赖浏览器运行的.想在php后端采集的同时利用js运行结果并传递给php使用,没戏! 然后回 ...
- sencha touch api 使用指南
本文主要讲解如何使用sencha touch的api以及如何查看api中官方示例源码 前期准备 1.sdk 下载地址:http://www.sencha.com/products/touch/down ...
- 关于python协程的一个例子的学习
例子来自https://blog.tonyseek.com/post/event-manage-with-greenlet/ 加了一些注释看懂了: 注释中的数字表示执行的顺序,这个简单的例子用到了py ...
- Android 优化布局层次结构
前面介绍过使用HierarchyViewer和Android lint来优化我们的程序,这一篇算是总结性的,借助一个小例子来说用怎么优化应用布局.这个例子是android官网给出的,作者也当一把翻译. ...
- 【转载】[JS]让表单提交返回后保持在原来提交的位置上
有时候,在网页中点击了页面中的按钮或是刷新了页面后,页面滚动条又 会回到顶部,想看后面的记录就又要拖动滚动条,或者要按翻页键,非常不方便,想在提交页面或者在页面刷新的时候仍然保持滚动条的位置不变,最好 ...
- MongoDB 安装记录
之前使用一直没记录,防再次掉坑,记录下 echo 开始 D: cd D:\Program Files\MongoDB\Server\3.2\bin mongod --install --service ...
- IIS6.0下 Asp.Net 拦截jpg请求
之前用mvc写了一个接口,访问格式 http://ip:port/{id}-{type}.jpg来获取一个图片,在IIS7.0+运行毫无障碍,但是在IIS6.0下,直接提示文件不存在或者已删除. 经过 ...
- Shader Overview
Unity有三种形式的Shader: (1)Surface Shaders:对光照管线的高层抽象,受光照和影子效果影响的shader,使用Cg/HLSL语言编写:不进行light相关操作的shader ...