0

0

MySQL的timestamp类型自动更新

php中文网

php中文网

发布时间:2016-06-07 17:52:21

|

1307人浏览过

|

来源于php中文网

原创

MySQL的timestamp类型自动更新 有需要的朋友可参考本文章。

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

    查找资料,发现是我建表的语句有问题:


以下是代码片段:

 代码如下 复制代码
CREATE TABLE `test` (
  `t1` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `ww` varchar(5) NOT NULL
) ENGINE=MyISAM ;

 


    而实际上,以下两个建表语句的效果是一样的:


以下是代码片段:

 代码如下 复制代码

CREATE TABLE `test` (
`t1` TIMESTAMP NOT NULL ,
`ww` VARCHAR( 5 ) NOT NULL
) ENGINE = MYISAM

CREATE TABLE `test` (
  `t1` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `ww` varchar(5) NOT NULL
) ENGINE=MyISAM ;

 


    比较之下,我的语句少了“on update CURRENT_TIMESTAMP”或多了“default CURRENT_TIMESTAMP”。如此一来,这个timestamp字段只是在数据insert的时间建立时间,而update时就不会有变化了。当然,如果你就是想达到这个目的倒也无所谓。

    查找英文手册(http://dev.mysql.com/doc/refman/5.1/en/timestamp.html),得到更详细的解说,翻译如下:

-----------------------------------翻译开始--------------------------------

    在CREATE TABLE语句中,第1个TIMESTAMP列可以用下面的任何一种方式声明:

    1: 如果定义时DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句都有,列值为默认使用当前的时间戳,并且自动更新。

    2: 如果不使用DEFAULT或ON UPDATE子句,那么它等同于DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。

    3: 如果只有DEFAULT CURRENT_TIMESTAMP子句,而没有ON UPDATE子句,列值默认为当前时间戳但不自动更新。

    4: 如果没用DEFAULT子句,但有ON UPDATE CURRENT_TIMESTAMP子句,列默认为0并自动更新。

动力先锋仿阿里巴巴B2B电子商务系统
动力先锋仿阿里巴巴B2B电子商务系统

前台功能介绍:1、网页首页显示有高级会员推荐,精品推荐,商业机会分类列表,最新供求信息,网站动态,推荐企业,行业动态等;2、商业机会栏目功能有:二级分类,已经带有详细分类的数据库,后台可以更改增加操作,并可以推荐公司,栏目分为分类显示信息,最新的采购、供应、合作和代理信息,搜索时同样按分类,信息,时间,交易类型等搜索;3、展厅展品栏目功能:二级分类,已经带有详细分类的数据库,后台可以更改增加操作,

下载

    5: 如果有一个常量值DEFAULT,该列会有一个默认值,而且不会自动初始化为当前时间戳。如果该列还有一个ON UPDATE CURRENT_TIMESTAMP子句,这个时间戳会自动更新,否则该列有一个默认的常量但不会自动更新。

    换句话说,你可以使用当前的时间戳去初始化值和自动更新,或者是其中之一,也可以都不是。(比如,你在定义的时候可以指定自动更新,但并不初始化。)下面的字段定义说明了这些情况:


以下是代码片段:

 代码如下 复制代码

自动初始化和更新:
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

只自动初始化:
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP

只自动更新
ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP

只是给一个常量(注:0000-00-00 00:00:00)
ts TIMESTAMP DEFAULT 0

 


-----------------------------------翻译结束--------------------------------

    上面我用红色字体标出了"第1个TIMESTAMP列",这是因为,一个表有多个timestamp列的话,定义起来是不一样的。

    比如上面的第二条:“如果不使用DEFAULT或ON UPDATE子句,那么它等同于DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。”如果是第二个timestamp列就不一样了,请看:


以下是代码片段:

 代码如下 复制代码
CREATE TABLE `test` (
`ww` VARCHAR( 9 ) NOT NULL ,
`t1` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`t2` TIMESTAMP NOT NULL
) ENGINE = MYISAM

 

    这个情况下,数据插入时,t1会记录当前时间,t2为默认值(0000-00-00 00:00:00),等同下面的语句:


以下是代码片段:

 代码如下 复制代码
CREATE TABLE  `test` (
`ww` VARCHAR( 9 ) NOT NULL ,
`t1` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`t2` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE = MYISAM 

 
    而根据上面的第二条,应该是:


以下是代码片段:

 代码如下 复制代码
CREATE TABLE `test` (
`ww` VARCHAR( 9 ) NOT NULL ,
`t1` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`t2` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE = MYISAM 
 

    但实际上,上面的语句是个语法错误,mysql会返回:


以下是引用片段:

 代码如下 复制代码
#1293 - Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause 

 
    我曾经想这样设计一个表,这个表有两个timestamp列,一个可以记录更新时间,一个可以记录初始时间,但是尝试多次以后,我发现mysql好像做不到这一点,不知道这个是mysql的缺陷还是自我优化,因为,这个功能可以使用datetime实现记录初始化的时间,只是需要insert的时候指定一下。

相关专题

更多
虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

29

2025.12.25

错误代码dns_probe_possible
错误代码dns_probe_possible

本专题整合了电脑无法打开网页显示错误代码dns_probe_possible解决方法,阅读专题下面的文章了解更多处理方案。

20

2025.12.25

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

37

2025.12.25

word转换成ppt教程大全
word转换成ppt教程大全

本专题整合了word转换成ppt教程,阅读专题下面的文章了解更多详细操作。

6

2025.12.25

msvcp140.dll丢失相关教程
msvcp140.dll丢失相关教程

本专题整合了msvcp140.dll丢失相关解决方法,阅读专题下面的文章了解更多详细操作。

2

2025.12.25

笔记本电脑卡反应很慢处理方法汇总
笔记本电脑卡反应很慢处理方法汇总

本专题整合了笔记本电脑卡反应慢解决方法,阅读专题下面的文章了解更多详细内容。

6

2025.12.25

微信调黑色模式教程
微信调黑色模式教程

本专题整合了微信调黑色模式教程,阅读下面的文章了解更多详细内容。

5

2025.12.25

ps入门教程
ps入门教程

本专题整合了ps相关教程,阅读下面的文章了解更多详细内容。

4

2025.12.25

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

218

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 2.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号