MySQL timestamp类型列值自动更新

MySQL中使用timestamp定义字段,默认情况下会给字段添加自动更新的属性,本文将分析这个自动更新的设置。

问题概述

一个表中定义了两个timestamp类型的字段,

create_time TIMESTAMP NOT NULL COMMENT '创建时间',

update_time TIMESTAMP NOT NULL COMMENT '更新时间'

新插入记录时,给create_time和update_time各自赋予当前时间值,没出现问题。更新记录时代码中只更新update_time,结果create_time也被自动更新成了当前时间。

刨根问底

在create table语句中,对第一个出现的timestamp类型字段的定义会有如下几种情况:

  • 使用DEFAULT CURRENT_TIMESTAMP,表示列值为当前时间戳但不会自动更新;
  • 使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,表示列值为当前时间戳并且自动更新,也就是每次更新记录都会自动更新该列值为当前时间戳;
  • 没有使用DEFAULT CURRENT_TIMESTAMP或DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,它默认使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
  • 没有使用DEFAULT CURRENT_TIMESTAMP,而使用了ON UPDATE CURRENT_TIMESTAMP,列值默认为0并且自动更新;

而第二个出现的timestamp类型字段,如果没有使用DEFAULT CURRENT_TIMESTAMP或DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,它默认使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。

对于使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP进行定义的列,需要注意的是如果该字段值没有发生变化,将不会进行更新,而且对于多个使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP进行定义的列,mysql只会更新第一个使用它定义的列。

所以,问题概述中的SQL片段应该改成,

create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'

原文发布于微信公众号 - JavaQ(Java-Q)

原文发表时间:2017-08-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维技术迷

MySQL数据库(五):索引

一.什么是索引 相当于一本数的目录 二.使用索引的好处和坏处 好处:加快查找速度 坏处:占用磁盘空间 三.查看索引命令 命令格式: show inde...

29690
来自专栏一个会写诗的程序员的博客

SQL中的DML、DDL以及DCL是什么?

DML(data manipulation language)是数据操纵语言:它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这...

9640
来自专栏互联网杂技

修改数据表之添加主键约束

上一篇是对表中列的操作: 涉及到列的增删改查; ----- 而本篇是设置一个与另一个表的关系,还有列的默认值; ---- 1.一个表创建之后, 需要对这个表中的...

342110
来自专栏xingoo, 一个梦想做发明家的程序员

Mysql Insert Or Update语法实例

有的时候会需要写一段insert的sql,如果主键存在,则update;如果主键不存在,则insert。Mysql中提供了这样的用法:ON DUPLICATE...

21870
来自专栏Netkiller

数据库安全·为数据安全而分库

以下节选择《Netkiller Architect 手札》地址 http://www.netkiller.cn/architect/ 接下来几周的话题是数据库安...

35480
来自专栏杨建荣的学习笔记

两个死锁的实例 (r5笔记第90天)

关于数据库中的死锁。如果在应用中碰到都会毫不犹豫转交给DBA,但是从目前我接到的deadlock的问题来看,和Oracle官方的描述基本都是一致的。 The f...

32860
来自专栏zcqshine's blog

update in 的优化写法

22870
来自专栏WindCoder

当 NOT NULL DEFAULT遇到 Invalid use of NULL value

ERROR 1138 (22004) at line 7: Invalid use of NULL value

32310
来自专栏技术碎碎念

sql server 触发器

触发器是一种特殊类型的存储过程。触发器可包含复杂的T-SQL语句。触发器不能通过名称被直接调用,也不允许设置参数。它是建立在触发事件上的。 触发器可以强制执行一...

43380
来自专栏机器学习从入门到成神

org.hibernate.hql.ast.QuerySyntaxException is not mapped异常

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

14420

扫码关注云+社区

领取腾讯云代金券