1.概述

在我们设计表的时候,考虑将行数据的创建时间和最后更新时间记录下来是很好的实践。尤其是可能需要做数据同步或者对数据新鲜度有要求的表。举些应用场景,更新距上次更新超过2小时的行数据,或者是将一个月前的订单数据归档等等。我们想把这个的需求丢给数据库服务器管理,而不是在应用程序中对每一条语句设置创建时间和最后更新时间字段。在mysql中,这实现起来很容易。我们需要借助于DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP

2.简单示例

1 --创建测试表

2 CREATE TABLE `timestampTest` (

3   `id` int(11) NOT NULL AUTO_INCREMENT,

4   `name` varchar(20) DEFAULT NULL,

5   `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

6   `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

7   PRIMARY KEY (`id`)

8 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

9

10 --检测默认值,插入测试数据

11 INSERT INTO timestampTest (name) VALUES ('aa'),('bb'),('cc');

12

13 --检测自动更新,更新某条数据

14 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的异同timestampdatetime

同可自动更新和初始化,默认显示格式相同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.参考

作者: zhaoyanghoo 出处: http://www.cnblogs.com/zhaoyanghoo/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

mysql timestamp 更新_[mysql] timestamp自动更新和初始化相关推荐

  1. sublime 设置自动更新_不止是自动更新!简单几步让Windows 10变听话的孩子

    免费参与!萤石C6C互联网摄像机众测报名了 电脑报蛋黄星球众测·第四期来了,这一次众测的产品是来自萤石的C6C互联网摄像机1080P无极巡航版本,将从申请报名的用户中选择20名参与众测,重点本次众测是 ...

  2. 火狐浏览器怎么关闭自动更新 火狐浏览器关闭自动更新的方法

    火狐浏览器怎么关闭自动更新?很多用户觉得更新完新版本,用起来很不习惯.要怎么才能不自动更新呢,下面就给大家分享具体步骤. 首先我们要做的当然是打开你的火狐浏览器了,如果菜单栏在的话,点击工具选项. 火 ...

  3. 计算机自动更新的作用,电脑自动更新系统的好处和坏处有哪些?

    电脑系统自动更新是默认开启的, 很多小伙伴都遇到过提示电脑系统更新.那么系统自动更新有什么好处和坏处呢? 工具/原料 电脑 方法/步骤 开启电脑系统的自动更新,可以让电脑保持最新系统,可以修复已知的系 ...

  4. 阻止计算机系统自动更新,如何防止电脑自动更新系统

    其实我们的电脑自己用,没必要每天自动更新,太浪费时间浪费流量了.电脑经常性的反应慢,网速慢,并且开机关机都要更新配置,一更新少则几分钟,多则几十分钟.今天小编为大家推荐防止电脑自动更新的方法. 防止电 ...

  5. mysql 表设计时的update_time自动更新

    11.3.5 Automatic Initialization and Updating for TIMESTAMP and DATETIME 原文地址:https://dev.mysql.com/d ...

  6. ef mysql自动更新_EntityFrameworkCore使用Migrations自动更新数据库

    EntityFrameworkCore使用Migrations自动更新数据库 系统环境:Win10 IDE:VS2017 RC4 .netcore版本:1.1 一.新建ASP.NET Core Web ...

  7. 不会自动更新了_手机老是自动更新系统?不想频繁更新,不同手机怎么设置好?...

    手机换代快,相应的手机系统更新也很快.由于很多手机会自动更新系统,这个是很方便的.但如果我们不想更新系统,怎么关闭阻止系统更新呢?小移教你几招~ 小米 小米手机,在用的系统版本很顺手,感觉没必要频繁更 ...

  8. layerconfirm 自动关闭问题 没有阻塞问题_微信新版本自动更新?赶紧关闭这个功能...

    前不久 安卓用户也迎来了微信新版本的更新 不少伙伴惊呼 "猝不及防,一觉醒来发现微信自动更新了" 一时间还冲上了话题的热搜榜 究竟是怎么肥事? 小移了解到: 原来是因为部分用户设置 ...

  9. 怎么用微软云盘自动备份文件_微软通过自动更新打破了Windows 10的文件关联

    怎么用微软云盘自动备份文件 File associations no longer work properly on Windows 10 after a buggy update. Windows ...

最新文章

  1. wordpress导航页采用分类目录排序
  2. Linux_DHCPDHCP Relay
  3. ASP.Net TextBox控件只允许输入数字
  4. 2021牛客暑期多校训练营6 :D Gambling Monster 期望dp + fwt + cdq分治
  5. ComponentArt控件分析之ComboBox(2)
  6. 不懂开发的运维,未来该如何发展?
  7. SpringAOP原理分析
  8. 2021年中国宽带接入情况、用户规模及使用情况分析[图]
  9. 虚拟机安装ubantu系统的详细操作
  10. linux怎样收集系统信息,Linux下收集系统和硬件信息的10个实用命令
  11. 全球400多支团队参加,鹅厂是如何拿下冠军的
  12. 修改sep客户端服务器地址,SEP服务更改IP地址操作手册
  13. Visio图标下载链接
  14. [多校联考-初级]徒步旅行
  15. map遍历的三种基础用法
  16. iphone 手机忘记 访问限制密码 处理方法(未越狱版)
  17. 模式先行区块链商城将颠覆传统商城
  18. php 背景图片上加载设备状态,PHP 将动态图片与固定背景图片合成并添加水印。...
  19. 江苏省泰州中学2021年高考成绩查询,泰州中学排名前十名,2021年泰州中学排名一览表...
  20. Mac说——关闭SIP

热门文章

  1. 空间点像素索引(二)
  2. 2021年大数据基础(一):大数据概念
  3. Python find方法与rfind方法的使用
  4. Android 标签 (FlexboxLayout实现标签)
  5. OpenCV矩阵运算
  6. LINQ 学习路程 -- 查询操作 GroupBy ToLookUp
  7. 结构化方法与面向对象方法之比较
  8. TMS320F28335项目开发记录2_CCS与JTAG仿真器连接问题汇总
  9. 在js中使用createElement创建HTML对象和元素
  10. k均值聚类图像分割matlab代码_用K均值聚类法为人类拍摄的首张黑洞照片进行分割...