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类型的处理:

    1. mysql不会给timestamp设置默认值,除非显式设置default约束或者可空null。特例:mysql会给表第一个timestamp类型的字段同时添加default current_timestamp和on update timestamp
    2. 禁止mysql的特例处理有两个办法
      1. 设置explicit_defaults_for_timestamp为enable
      2. 显式设置该字段default或者null
    3. timestamp列默认not null。没有显式指定nullable,那么default null不合法
    4. 其他情况均会引起不合法报错

举一些例子,帮助理解

 #语句不合法,出现了两个未显示设置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

'1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC

自动时区转化,实际存储毫秒数,4字节存储

'1000-01-01 00:00:00' to '9999-12-31 23:59:59'

不支持时区,8字节存储

4.参考

1.Automatic Initialization and Updating for TIMESTAMP and DATETIME

2.Date and Time Functions

[mysql] timestamp自动更新和初始化的更多相关文章

  1. timestamp ---自动更新修改时间 与 记录首次插入时间

    自动更新修改时间: mysql> create table z(a int ,b timestamp on update current_timestamp); mysql> insert ...

  2. mysql 时间自动更新问题

    万恶的根据当前时间戳更新,有时候会自动更新,有时候又不会. 通过navicat 创建datetime类型的字段时,会自动勾选上根据当前时间戳更新.当更新数据的时候勾上这个的字段时间就会更改为当前的时间 ...

  3. mysql中自动更新时间CURRENT_TIMESTAMP

    timestamp的两个属性:CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP http://blog.163.com/qiongling007@126/b ...

  4. mysql 添加[取消]timestamp的自动更新

    创建自动更新的 timestamp (插入或修改时 uptime都会自动更新) CREATE TABLE `hello` (`id` int(11) NOT NULL,`uptime` timesta ...

  5. mysql 修改[取消]timestamp的自动更新

    创建自动更新的 timestamp (插入或修改时 uptime都会自动更新) CREATE TABLE `hello` ( `id` int(11) NOT NULL, `uptime` times ...

  6. 设置TIMESTAMP和DATETIME的自动初始化及自动更新

    最近有一个关于MySQL版本升级的事,涉及到一些关于时间类型的细节问题需要查明,因此到官网找到相关文章,翻出来比较方便自己理解,博客这里也贴一下. 参考官网网址: https://dev.mysql. ...

  7. MySQL的timestamp类型自动更新问题

    今天建了一个表,里面有一个列是timestamp类型,我本意是在数据更新时,这个字段的时间能自动更新.岂知对这个类型的值还不甚了解,导致出错.发现这个字段只是在这行数据建立的时候有值,在更新的却无变化 ...

  8. timestamp的自动更新 ON UPDATE CURRENT_TIMESTAMP

    最近有一个关于MySQL版本升级的事,涉及到一些关于时间类型的细节问题需要查明,因此到官网找到相关文章,翻出来比较方便自己理解,博客这里也贴一下. 参考官网网址: https://dev.mysql. ...

  9. MySQL load数据的时候自动更新时间

    MySQL load数据的时候自动更新时间 前提 CREATE TABLE table_name ( dt varchar(255) NULL , ctime timestamp NULL ON UP ...

随机推荐

  1. iOS开发备忘录:自定义UINavigationBar背景图片和Back按钮

    iOS项目,根据设计图,有时需要自定义UIView的UINavigationBar的背景.可以切出来一张1像素左右的背景图片,来充当UINavigationBar的背景. 可以利用Navigation ...

  2. 安装Window Services 提示错误 [SC] OpenSCManager FAILED 5

    通过CMD注册Windows服务 之前一直这样写一直也是注册成功,今天却遇到了问题SC Manager 失败 sc create  RenService binPath=  C:\Tools\Stat ...

  3. window 内核详尽分析

    http://bbs.pediy.com/showthread.php?t=185055

  4. Java Web dev搭建经验总结

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! 回馈分析法使我看到,我对专业技术人员,不管是工程师.会计师还是市场研究人员,都容易从直觉上去理解 ...

  5. A successful Git branching model

    这个模型比较全,收藏一下,原文: http://nvie.com/posts/a-successful-git-branching-model/ 关于这个模型中的hotfix只适应最新的Release ...

  6. EETOP中关于Gm仿真的一些帖子的总结

    1. cadence画gm曲线 电路里,要把漏的电源dc值设置成变量,比如叫vds,计算器,info标签,点op,然后点管子,在op窗口点list,选gm,然后把这个公式弄到ADE的outputs那里 ...

  7. windows下配置启动多个mysql服务

    查找配置做下记录 先安装mysql5.6,安装不在介绍 接下来配置启动另一个mysql服务, 1:先到服务里停止在运行的mysql服务 2:到mysql的安装目录下(默认安装目录在c:\Program ...

  8. Android对话框之Context

    代码就这么一段: new AlertDialog.Builder(getApplicationContext(),R.style.MyAlertDialogStyle) .setTitle(" ...

  9. 安卓开发笔记——重识Activity

    Activity并不是什么新鲜的东西,老生常谈,这里只是随笔记录一些笔记. 每当说起Activity,感觉最关注的还是它的生命周期,因为要使我们的应用程序更加健壮,客户体验更加良好,如果对生命周期不熟 ...

  10. 树莓派 HC-SRO4超声波测距模块的使用

    先上个图 这个模块的针脚跟之前玩的那三个有所区别,除了VCC和GND两个针脚,还多了两个Trig和Echo针脚,分别是输出和输入,Trig我接的是20针脚,Echo是21 该模块的工作原理为,先向TR ...